59 votes

Sont fonction des variables statiques thread-safe dans le GCC?

Dans l'exemple de code

void foo()
{
  static Bar b;
  ...
}

compilé avec GCC est-il garanti qu' b sera créé et initialisé dans un "thread-safe"?

Dans la page de man de gcc, a trouvé l' -fno-thread-safe-statique option de ligne de commande:

N'émettent pas le code supplémentaire pour utiliser le routines spécifié dans l'ABI C++ pour "thread-safe" initialisation de locaux la statique. Vous pouvez utiliser cette option pour réduire la taille du code légèrement dans le code que n'a pas besoin d'être thread-safe.

  1. Signifie-t-il, que les locaux de la statique sont thread-safe par défaut avec GCC ? Donc pas de raison de mettre explicite de gardiennage, par exemple, avec pthread_mutex_lock/unlock ?

  2. Comment écrire du code portable - comment faire pour vérifier si le compilateur va ajouter ses gardes ? Ou est-il préférable de désactiver cette fonction de GCC ?

42voto

Charles Bailey Points 244082
  1. Non, cela signifie que l' initialisation de locaux statics est thread-safe.

  2. Vous avez certainement envie de laisser cette fonction activée. "Thread-safe" initialisation de locaux statics est très important. Si vous avez besoin généralement de thread-safe d'accès au local - statics, alors vous aurez besoin d'ajouter les gardes vous-même.

17voto

shojtsy Points 565

Nous avons eu de sérieux problèmes avec le code de verrouillage généré par GCC 3.4 pour protéger les locaux initialisation statique. Cette version a utilisé un mondial partagé mutex pour protéger toutes et tous initialisation statique qui conduisent à un blocage dans notre code. Nous avons eu une variable statique locale initialisé à partir d'un résultat d'une fonction, qui a commencé un autre thread, ce qui a créé une variable statique locale. Pseudo-code:

voif f()
{
  static int someValue = complexFunction();
  ...
}
int complexFunction()
{
  start_thread( threadFunc() );
  wait_for_some_input_from_new_thread();
  return input_from_new_thread;
}
void threadFunc()
{
  static SomeClass s();
  ...
}

La seule solution est de désactiver cette fonctionnalité de gcc. Si vous avez besoin de votre code pour être portable , ce que nous avons fait, vous pouvez pas de toute façon dépendent d'ajouter une fonctionnalité dans une version de gcc pour la sécurité des threads. Soi-disant C++0x ajoute thread-safe locale statique, jusqu'alors, c'est non-standard de la magie, ce qui rend votre code non portable, donc je conseille contre elle. Si vous décidez de l'utiliser, je vous suggère de vérifier que votre version de gcc ne pas utiliser un seul mutex global à cet effet par l'écriture d'un exemple d'application. (La difficulté de fil de sécurité est évident du fait que, même gcc ne peut pas obtenir de droit)

6voto

sbi Points 100828

Ce n'est pas vraiment répondre à vos questions tout de suite (Charles déjà fait), mais je pense qu'il est temps pour poster un lien vers cet article à nouveau. Il jette la lumière sur l'initialisation des variables globales et doivent être lues et comprises par tout le monde tente d'utiliser static variables dans un environnement multi-thread.

5voto

Stephen C Points 255558

Je pense que la phrase clé est

... "thread-safe" initialisationde local de la statique.

J'ai lu ce en ce sens que c'est seulement de l'initialisation de la statique qui serait fait dans un thread-safe. Générales d'utilisation de la statique ne serait pas thread-safe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X