2010-10-07 7 views
2

Google ne trouve rien. Sont-ils créés au point d'utilisation ou les parties génériques sont-elles partagées entre les instances?Les fonctions de modèle C++ sont-elles threadsafe?

(même pour les classes de modèle?)

+2

La réponse est "non". Maintenant, la question devient, savez-vous ce que «threadsafe» signifie vraiment? –

+0

@John Dibling: D'autres l'ont mieux expliqué que moi; voir ici: http://en.wikipedia.org/wiki/Thread_safety – slashmais

+1

il ne demande pas une définition de la sécurité des threads, mais plutôt ce que * vous * comprenez par le terme. Wikipedia ne nous le dit pas, et c'est ce qui est important pour répondre à cette question. – jalf

Répondre

11

fonctions de modèle sont créés au moment de la compilation. La propriété template est complètement orthogonale à thread-safety.

+0

Cela semble cool, mais qu'est-ce que cela signifie? :-) – DarkDust

+2

Juste au cas où ce n'était pas assez clair: Les modèles C++ sont ce que l'on appelle des "générateurs de code". Cela signifie que lorsque le compilateur rencontre le modèle, il crée littéralement un nouvel ensemble d'instructions machine pour chaque type que vous utilisez dans ce modèle. Pour cette raison, vous vous retrouvez avec deux fonctions complètement distinctes qui s'appellent. La fonction int () est un chemin de code complètement différent de la fonction int () au niveau de la machine, bien qu'ils fassent la même chose. Ainsi, leurs variables locales sont en effet threadsafe (différents cadres de pile), mais rien d'autre. – Bryan

+0

@Brian: des cadres de pile différents seraient-ils créés pour les types typedef'd? Ma connaissance des compilateurs-entrailles est un peu fragile. – slashmais

2

Les fonctions de modèle sont simplement ... des modèles utilisés par le compilateur pour générer des fonctions "normales". Donc, c'est la même chose que les fonctions normales, il n'y a pas de différence.

6

Ils ne sont pas plus ou moins thread-safe que tout autre type de fonction.

+0

+1: En d'autres termes, non. –

+3

@John Dibling: Dans un autre mot, * mu *. http://www.catb.org/jargon/html/M/mu.html –

+0

@Shmoopty: beaucoup mieux –

3

La seule façon que je peux penser à la sécurité de fil étant affectée par c'est que si someMethod<typename T>() était pas thread alors en toute sécurité, il serait encore acceptable pour un fil de fonctionner sur someMethod<int>() tandis qu'un autre a travaillé sur someMethod<std:string>(), aussi longtemps que le manque de la sécurité des threads n'est pas venu de leur appel à une fonction non-modélisée.

La situation où quelque chose d'autre garantit qu'un seul thread effectue une tâche particulière avec un type particulier à la fois semble assez improbable.

Questions connexes