C++: comment créer de thread local/global variable
dans ce code:
int foo() {
static int x;
}
est le x
global pour tous les threads ou local dans chaque thread? Ou dépend d'un compilateur du pavillon et/ou le compilateur, donc je ne sais vraiment ce que c'est à partir du code?
Plusieurs questions (qui sont tous des indépendants à partir de compilateur et les drapeaux de compilation et d'OS):
- Comment puis-je créer une variable statique qui est globale pour tous les threads?
- Comment puis-je créer une variable statique qui est local à chaque thread?
- Comment puis-je créer une variable globale qui est globale pour tous les threads?
- Comment puis-je créer une variable globale qui est local à chaque thread?
Je suppose que ce n'est pas en C++. (Est-il dans C++0x?) Une augmentation des lib qui peut faire cela?
OriginalL'auteur Albert | 2010-09-03
Vous devez vous connecter pour publier un commentaire.
x est globale pour tous les threads. Toujours, indépendant du compilateur et/ou de ses drapeaux. Indépendamment de savoir si c'est en C++11 et C++03. Donc, si vous déclarez un mondiaux réguliers ou variable locale statique, il va être partagé entre tous les threads.
En C++11, nous aurons le
thread_local
mot-clé. D'ici là, vous pouvez utiliser thread_specific_ptr de Boost.Fil de discussion.Hmm, en un sens, même si j'ai vu des usages de C++1x sens de se référer à C++10 ou C++11. Avez-vous des liens où cette appellation est discutée, et un consensus s'est essayé à atteindre?
le consensus et le C++ ne se mélange pas bien, la prochaine norme a été surnommé C++0x et en changeant son nom à mi-chemin ne fonctionne pas vraiment, surtout depuis que Bjarne et quelques autres ont annoncé qu'ils voulaient seulement 5 ans entre C++et C++0x 1x parce que l'industrie évolue rapidement, ils ont donc suggéré de faire le moins de variations, la prochaine fois, afin de garder à la date limite.
Comme je l'ai dit, c'est non officiel, c'est juste plus clair si vous utilisez un nom qui est toujours signifié sans ambiguïté la prochaine version. Voici un lien pour de Stroustrup FAQ; le troisième alinéa donne son opinion, et il fait aussi référence à C++1x dans un questions: www2.research.att.com/~bs/C++0xFAQ.html
Merci pour les commentaires. Je vais être sûr de les suivre pour éviter de créer la confusion, pour lequel je suis désolé, j'ai réussi à créer ce temps.
OriginalL'auteur usta
Rapide des réponses partielles;
Oui. Mais cela dépend de votre compilateur C++0x aussi de soutien.
Coup de pouce.Fils. Voir thread local storage y.
Notez qu'en général, statique se réfère à la durée et mondial se réfère à portée.
C++0x fil des constructeurs sont variadic: Vous pouvez passer n'importe quel nombre (et le type d'arguments. Tous ces éléments sont disponibles à votre
std::thread
objet.OriginalL'auteur dirkgently
Vous auriez à utiliser une sorte de croix-plate-forme de thread library (puisque vous avez mentionné OS de l'indépendance), mais compte tenu de pthreads que vous pourriez faire.
Je suis sûr que le code comporte des erreurs et doivent être traités comme des pseudo-code, car je suis un pseudo-programmeur quand il s'agit de C++. 🙂
Avec quelques pthreads sémaphores ajouté le code est toujours sous 20 lignes. Code à l'aide de variables globales au lieu de l'injection de dépendance n'est pas susceptible d'être rapide ou bien écrit, de toute façon avec ou sans les frais de recherches dans un arbre.
Pour avoir la variable dans la pile de thread et de l'accès c'est vraiment une opération rapide. C'est une simple O(1) d'accès et il n'a pas besoin de verrouillage/déverrouillage/synchronisation. Ce dernier peut avoir d'énormes répercussions. Fondamentalement, c'est la principale raison pour laquelle vous souhaitez avoir des threads variables locales à tous.
Oui, mais je ne vois pas comment cela peut être réalisé de manière transparente à travers plusieurs identiques fils sans injection de dépendance ou de dynamique de portée/prise en charge du compilateur.
OriginalL'auteur Novikov