2010-03-08 24 views
10

Les classes D2.0 ont une propriété de classe __monitor qui "donne accès au moniteur de l'objet de classe" (documentation). J'ai cherché un peu et n'ai trouvé aucune information sauf this peu de détail. Alors: qu'est-ce qu'un moniteur? Pourquoi est-ce qu'un moniteur est utilisé pour tous synchronized member functions? Est-ce un synchronization primitive utilisé pour synchroniser les fonctions membres similaires à Java? Et pourquoi est la propriété __monitor dans la langue def si vous n'êtes pas censé l'utiliser/quels sont les cas d'utilisation?Qu'est-ce qu'un moniteur de classe dans D?

Répondre

6

Le moniteur est un objet initialisé paresseusement sur lequel toutes les méthodes synchronisées se synchronisent, comme en Java. Contrairement à Java, D est un langage de programmation système et expose des détails de niveau inférieur de la façon dont les choses fonctionnent au cas où vous auriez besoin de les pirater, même si cela est habituellement une mauvaise idée. Cela vous permet de personnaliser le comportement. Par exemple, il est possible de personnaliser l'objet moniteur d'une classe ou d'utiliser un core.sync.mutex qui partage un moniteur avec la classe qui le possède.

+1

Merci. Donc, si je regarde object.d, je vois une interface 'Object.Monitor' (ou' IMonitor') pour ce moniteur. C'est ce que je dois mettre en œuvre? Et si je regarde 'core.sync.mutex', je vois un exemple d'utilisation (dans les commentaires quelque chose comme' // NOTE: Avec DMD cela peut être "o .__ monitor = & m_proxy" .'). Correct? – stephan

+0

@stephan: Je ne suis pas sûr, je n'ai jamais vraiment eu à jouer avec ça avant, donc je ne connais pas les détails. – dsimcha

+0

Vous ne devriez jamais avoir à implémenter le moniteur ou à le régler vous-même, sauf si vous faites quelque chose de * très * étrange. J'ai utilisé plusieurs fois les différentes primitives de synchronisation dans D et je n'ai jamais eu à faire quoi que ce soit de ce genre. –