web-dev-qa-db-fra.com

Prise en charge de plusieurs threads dans c11

La nouvelle norme C11 prend en charge le multithreading.
Mes questions sont un peu diversifiées, mais certainement fiables.
J'ai jeté un œil au brouillon C11 n157.
Ça dit:

prise en charge de plusieurs threads d'exécution, y compris un modèle de séquencement de mémoire amélioré, des objets atomiques et un stockage local de thread (<stdatomic.h> et <threads.h>)

Qu'est-ce que le modèle de séquencement de mémoire amélioré ? Comment/Quels changements par rapport à la norme c99?

Plutôt que de simples citations de standard, j'apprécierai si quelqu'un approfondit en elles et essaie d'expliquer la sémantique impliquée.

Si je comprends bien, C11 fournit un support pour:

  • Création et gestion de threads
  • Mutex
  • Variables conditionnelles
  • Stockage spécifique au fil et
  • Objets atomiques

J'espère que je n'ai rien raté?
.

Enfin, quels compilateurs prennent en charge les fonctionnalités mentionnées ci-dessus? Y a-t-il des références quant aux délais lorsque ceux-ci seront pris en charge?
Je me souviens que pour C++ 11, il y avait un lien pour le support et les fonctionnalités du compilateur, peut-être quelque chose comme ça?

65
Alok Save

Tout d'abord, ne supprimez pas C++ 11. Le travail de concurrence pour les nouvelles normes a été effectué sous l'égide de C++ 11, puis importé dans C11 dans le but explicite d'être compatible. Bien qu'il existe des différences syntaxiques (par exemple, du fait que le C simple n'a pas de modèles ou de surcharge de fonctions), sémantiquement, elles sont identiques par conception. Pour des "preuves" de cela, on peut vérifier les papiers du WG14. Par exemple:

et les références qui y figurent. Plus d'informations peuvent être trouvées sur Open Std Website

Passons maintenant à vos questions:

Qu'est-ce que le modèle de séquencement de mémoire amélioré?

La réponse évidente est qu'elle a été modifiée pour prendre en compte plusieurs threads et leur interaction. Pour une réponse un peu plus longue, voir C++ 11 a introduit un modèle de mémoire standardisé. Qu'est-ce que cela signifie? Et comment cela va-t-il affecter la programmation C++? qui a déjà été mentionné dans les commentaires. Pour une compréhension approfondie, une réponse stackoverflow n'est peut-être pas le bon endroit (encore moins une question avec plusieurs sous-questions!). Mais heureusement Hans Boehm maintient une très bonne page avec des liens intéressants pour une lecture plus approfondie (encore une fois, gardez à l'esprit que les modèles de mémoire C11 et C++ 11 sont sémantiquement identiques)

J'espère que je n'ai rien manqué?

Avec le modèle de mémoire, votre liste semble couvrir les ajouts de concurrence dans C11. Pour d'autres changements, wikipedia a une liste ; du haut de ma tête, je ne peux pas trouver quelque chose que la liste wikipedia a manqué.

Puisque maintenant la bibliothèque Standard elle-même fournit (fournira) toutes les fonctionnalités nécessaires pour le Multi-Threading, il n'y aurait plus besoin de POSIX et de telles bibliothèques (pour le support du Multi-Threading) à l'avenir?

Oui, il en aura besoin. Tout d'abord, personne ne va réécrire tout le code existant qui utilise les différentes API de thread existantes. Deuxièmement, la bibliothèque de threads C (++) 11 est/sera probablement implémentée comme un wrapper autour des diverses bibliothèques de threads natives; diable, il existe même un moyen documenté de récupérer un pointeur sur le thread natif sous-jacent, au cas où il faudrait faire quelque chose au-delà de ce que la bibliothèque de threads C (++) prend en charge. Pensez à la bibliothèque de threads C (++) 11 plus comme un wrapper de dénominateur portable et moins commun autour des diverses bibliothèques de threads natives.

Enfin, quels compilateurs prennent en charge les fonctionnalités mentionnées ci-dessus? Y a-t-il des références quant aux délais lorsque ceux-ci seront pris en charge? Je me souviens que pour C++ 11, il y avait un lien pour le support et les fonctionnalités du compilateur, peut-être quelque chose comme ça?

Je n'ai vu aucune liste détaillée, il ne semble pas y avoir autant de buzz autour de C11 par rapport à C++ 11. Il y a un court préavis pour le prochain GCC 4.7 ici: http://gcc.gnu.org/gcc-4.7/changes.html . Pour la prise en charge de la concurrence, on peut vérifier la prise en charge de la concurrence dans la page d'état C++ 11 ici: http://gcc.gnu.org/projects/cxx0x.html . Il y a aussi quelques notes sur l'état actuel et les plans de GCC à http://gcc.gnu.org/wiki/Atomic (selon cette page, stdatomic.h est disponible). Pour les autres compilateurs, il y a une belle liste de l'état C++ 11 pour divers compilateurs ici http://www.aristeia.com/C++11/C++11FeatureAvailability.htm . À partir des liens, on peut vérifier l'état du support de concurrence, et en supposant que le fournisseur en question prévoit de prendre en charge C11, le support de concurrence C11 est alors susceptible d'être à peu près au même niveau.

52
janneb

Janneb a déjà donné beaucoup d'explications. Pour vos dernières questions

Enfin, quels compilateurs prennent en charge les fonctionnalités mentionnées ci-dessus? Y a-t-il des références quant aux délais lorsque ceux-ci seront pris en charge?

La famille de compilateurs gcc (clang, icc, opencc) prend en charge la plupart des sémantiques requises par la nouvelle norme, il n'y a que des différences syntaxiques. (clang implémente même _Generic dans la dernière version.)

Pour P99 j'ai écrit macros wrapper qui mappent la plupart des fonctionnalités à quelque chose qui est déjà la syntaxe C11, ou qui s'en rapproche (pour émuler _Generic).

Donc, si vous avez l'un de ces compilateurs et sur un système POSIX, vous pouvez commencer à utiliser beaucoup (la plupart) de C11 immédiatement: des threads avec tous les types mtx_h etc, atomics avec _Atomic, tapez des macros génériques (la syntaxe est légèrement différente de C11), _Static_assert et l'alignement.

2
Jens Gustedt