2012-02-09 2 views
2

Ceci est une question d'interview.Dans quels cas, un motif de conception singleton peut générer plusieurs instances de la même classe singleton?

En C++, pour le modèle de conception singleton, est-il possible qu'il y ait instances multiples de la classe? Si oui, dans quels cas?

Mon idée:

En cas multithreading, sans protections synchrones, il est possible que nous puissions avoir plusieurs instances générées par plusieurs threads.

Nous pouvons utiliser un mutex pour faire la protection. Par exemple, utilisez un mutex pour protéger une variable globale en tant que compteur afin de conserver le nombre d'instances pour garantir qu'il n'y a qu'une seule instance.

De meilleures idées?

+0

Ça me regarde. – Dave

Répondre

3

En C++ 11 il y a une nouvelle installation pour faire passage unique Seule l'initialisation est fiable - std::call_once.Vous pouvez trouver une bonne référence pour cela here. Si vous travaillez avec un compilateur qui prend en charge C++ 11, vous disposez d'une manière standard, indépendante et indépendante de la plate-forme, de l'accomplir. Au niveau dépendant de la plate-forme, la plupart des systèmes d'exploitation fournissent un moyen de procéder à une initialisation unique. Par exemple. Sous iOS ou OS X, vous pouvez utiliser dispatch_once à partir de Grand Central Dispatch. Sur Windows, il y a un One-Time Initialization API disponible dans Vista et plus tard. C'est bon quand vous n'avez pas d'alternative standard, mais grâce à C++ 11, vous n'avez plus besoin de faire ce genre de chose de manière dépendante de la plate-forme. C'est parfait pour l'initialisation singleton.

+0

j'aime cette solution, +1 – lurscher

+0

merci, et si plusieurs threads appellent std :: call_once? et, et si la version muy C++ ne supporte pas C++ 11? merci – user1000107

+0

@ user1000107, je pense que l'exemple lié par aalpern dit tout? – lurscher

0

La réponse évidente: cela dépend de l'implémentation, mais si la possibilité existe pour plus d'une instance, l'implémentation est cassée. Donc, la question est vraiment parce que: quel genre d'erreurs pouvez-vous faire lors de la mise en œuvre d'un singleton? (À laquelle la réponse est: joli beaucoup les mêmes erreurs que vous pouvez faire lors de la mise en œuvre de n'importe quel modèle.)

0

Vérifiez également les problèmes avec un motif de verrouillage double-cocher. Problème décrié sur Internet beaucoup de fois. Mais ... 99% des singletons que j'ai vus dans ma vie utilisent ce modèle :)

2

Cela peut sembler évident, mais si vous avez plusieurs processus, vous pouvez avoir des instances singleton multiplexes. Je suis plus un mec java, mais si vous avez quelque chose d'équivalent avec ClassLoader, alors vous pouvez avoir plusieurs singletons. Fondamentalement, vous pouvez avoir autant de singletons que d'entités contrôlant l'instanciation (en parlant de modèle d'usine ici)

+0

Que faire si plusieurs threads? Merci ? – user1000107

1

sur OS X, les objets statiques dans différentes bibliothèques dynamiques seront des instances différentes. Sous Windows et Linux, ils se comporteront comme prévu.

La seule façon garantie d'avoir des objets statiques uniques à travers un processus dans différentes plates-formes est d'utiliser l'expression variable locale statique dans les fonctions exportées, qui est, au lieu de le faire:


foo.h

static Foo* global_instance; 

foo.cpp

static Foo* global_instance = new Foo(); 

vous devez faire ceci:


foo.h

Foo* get_global_instance(); 

foo.cpp

Foo* get_global_instance() { 
    static Foo instance; 
    return &instance; 
    } 
+0

Foo * get_global_instance() { static Foo instance; retour & instance; } doit être Foo * get_global_instance() { if (instance == NULL) instance de Foo statique; retour & instance; } – user1000107

+0

@ user1000107, pas mon ami. L'instance Foo statique est une initialisation qui ne se produit qu'une seule fois, la première fois que la fonction est appelée – lurscher

+0

@ user1000107, la solution aalpern 'est la solution la plus générale pour votre problème. – lurscher

0

OK, c'est possible. Sur l'interface vous avez singleton ... mais dans la mise en œuvre a choisi d'avoir plusieurs instances pour une raison quelconque .. peut-être la mise en commun?

0

Les questions d'entrevue essaient généralement de tester vos connaissances d'un sujet et ont généralement un truc pour eux. Je pense que dans ce cas la réponse est la suivante: s'il y a plus d'une instance dans la classe, alors ce n'est pas un pattern singleton.