2010-09-03 7 views
8

dans ce code:C++: comment créer fil variable locale/globale

int foo() { 
    static int x; 
} 

est le x global à tous les threads ou local dans chaque thread? Ou est-ce que cela dépend d'un drapeau de compilateur et/ou du compilateur, donc je ne peux pas vraiment savoir ce que c'est du code?

Plusieurs questions (tous indépendants de drapeaux du compilateur et compilateur et OS):

  1. Comment puis-je créer une variable statique qui est globale à toutes les discussions?
  2. Comment créer une variable statique qui est locale à chaque thread?
  3. Comment puis-je créer une variable globale qui est globale pour tous les threads?
  4. Comment créer une variable globale qui est locale à chaque thread?

Je suppose que ce n'est pas en C++ lui-même. (Est-ce en C++ 0x?) Quelques Boost lib qui peut faire ceci?

Répondre

6

x est global pour tous les threads. Toujours, indépendant du compilateur et/ou de ses drapeaux. Indépendamment de savoir si cela est en C++ 11 ou C++ 03. Donc, si vous déclarez une variable locale régulière ou statique, elle sera partagée entre tous les threads. En C++ 11, nous aurons le mot-clé thread_local. Jusque-là, vous pouvez utiliser thread_specific_ptr de Boost.Thread.

+1

Pour éviter toute confusion, il est préférable de se référer à la version à venir en C++ 0x, même si elle n'a pas été terminée avant 2010. C++ 1x est le nom non officiel de la version, qui pourrait être achevé avant 2020. –

+0

Hmm, est logique, bien que j'ai vu des usages de C++ 1x signifiant se référer à C++ 10 ou C++ 11. Avez-vous des liens où cette dénomination est discutée, et un consensus est tenté d'être atteint? – usta

+0

consensus et C++ ne se mélangent pas bien, la norme suivante a été nommée C++ 0x et changer son nom à mi-chemin ne fonctionne pas vraiment, d'autant plus que Bjarne et quelques autres ont annoncé qu'ils voulaient seulement 5 ans entre C++ 0x et C++ 1x car l'industrie évolue rapidement, ils ont donc suggéré de faire moins de changements la prochaine fois, afin de respecter les délais. –

1

Réponses partielles rapides;

(Est-il en C++ 0x?)

Oui. Mais cela dépend aussi du support C++ 0x de votre compilateur.

Certains Boost lib qui peut le faire?

Boost.Threads. Voir thread local storage dans celui-ci.

  1. Comment puis-je créer une variable statique qui est globale à tous threads? Comment puis-je créer une variable statique qui est locale à chaque thread ?
  2. Comment puis-je créer une variable globale qui est globale à tous les threads ?
  3. Comment puis-je créer une variable globale qui est locale à chaque thread ?

Notez que généralement, statique fait référence à la durée et à la portée mondiale fait référence.

C++ constructeurs de fil 0x sont variadique: Vous pouvez passer un certain nombre (et le type) d'arguments. Tous ces éléments sont disponibles pour votre objet std::thread.

#include <thread> 

int main() 
{ 
    int foo = 42; 
    std::thread t(foo); // copies foo 
    std::thread s(&foo); // pass a pointer 
    t.join(); 
} 
1

Vous devriez utiliser une sorte de bibliothèque de threads multiplateforme (puisque vous avez mentionné l'indépendance du système d'exploitation), mais étant donné les pthreads que vous pourriez faire.

template <T> 
class myVarStorage 
{ 
    static std::map<int, T> store_; 
public: 
    myVarStorage(); 
    T getVar(); 
    void setVar(T); 
} 

template <T> void myVarStorage::setVar<T>(T var) 
{ 
    store_[static_cast<int>pthread_self()] = var; 
} 

template <T> T myVarStorage::getVar() 
{ 
    return store_[static_cast<int>pthread_self()]; //throws exception 
} 

Je suis sûr que le code comporte des erreurs et doit être traité comme pseudo-code, puisque je suis un pseudo-programmeur en matière de C++. :)

+0

Notez que votre code n'est pas adapté aux threads, il nécessite donc une manipulation supplémentaire. :) Ensuite, ce serait le moyen de l'implémenter de manière sécurisée et crossplateforme. Mais c'est aussi très inefficace. Vous avez besoin de O (log n) (n étant la quantité de threads) pour chaque accès. Dans les autres solutions, vous avez juste besoin du temps d'accès O (1). – Albert

+0

Avec certains sémaphores pthreads ajoutés, le code est toujours inférieur à 20 lignes. Le code utilisant des globals au lieu de l'injection de dépendances n'est pas susceptible d'être rapide ou bien écrit avec ou sans la surcharge des recherches dans un arbre. – Novikov

+0

Avoir la variable dans la pile de threads et y accéder est une opération très rapide. C'est un simple accès O (1) et il n'a pas besoin de verrouillage/déverrouillage/synchronisation. Ce dernier peut avoir un effet énorme. C'est essentiellement la raison principale pour laquelle vous voulez avoir des variables locales. – Albert