2011-08-25 4 views
3

Disons que j'ai une classe avec une fonction statique. Le constructeur de la classe fait pthread_create en utilisant la fonction statique comme point d'entrée.C++ Fonction statique duplication

Ma question est:

Si j'avais plusieurs instances de cette classe, seraient-ils courir tout leur propre fil à l'aide de cette fonction? Y a-t-il des problèmes avec cela? Et ... si la fonction elle-même comportait des variables statiques, aurais-je un problème avec ce fait qu'elle ne soit pas réentrante?

+0

Vous ne savez pas exactement ce que vous entendez par «exécuter leur propre thread», mais la réponse à votre dernière question est oui, vous auriez des problèmes. – john

+0

Si vous transmettiez le pointeur "this" de chaque classe à votre point d'entrée de fonction statique pour que chaque thread accède aux membres depuis sa propre instance de la classe, vous n'auriez aucun problème. – Erik

Répondre

3

Si votre constructeur exécute un pthread_create() à chaque fois, alors vous aurez autant de threads que d'objets. Si ces threads accèdent à des variables static dans votre classe, vous devrez vous assurer que l'accès à ces variables est protégé par un mutex. (De même, si ces threads accèdent à des variables non static, vous devrez également protéger ceux aussi, d'autres appelants aux méthodes de votre objet).

Un thread par objet est probablement trop nombreux, vous pouvez donc vouloir reconsidérer votre conception.

1

Oui, toutes les classes démarreront un nouveau thread avec la même fonction. Tout comme ils le feraient avec une fonction non-membre.

Comme pour les variables statiques de fonction, que est un problème. Parce que C++ ne définit réellement rien sur la concurrence, vous êtes probablement en train de regarder une condition de concurrence. Même dans la construction de ces variables de fonction-statique. Jusqu'à ce que le support C++ 0x soit disponible, vous devrez rechercher des capacités de threading spécifiques au compilateur pour votre CPU, de sorte que vous puissiez lui indiquer de rendre ces variables statiques de fonction "thread local". De cette façon, chaque thread obtient sa propre copie.

Questions connexes