68 votes

Support du Multi-thread en c11

La nouvelle C11 norme fournit un support pour le Multi-Threading.
Mes Questions sont un peu diversifié mais certainement responsable.
J'ai eu un coup d'oeil à la C11 n1570 projet.
Il dit:

prise en charge de plusieurs threads d'exécution, y compris une amélioration de la mémoire de séquençage modèle atomique objets, et enfilez-les locaux de stockage (<stdatomic.h> et <threads.h>)

Qu'est-ce que l' Amélioration de la mémoire de séquençage de modèle? Comment/Ce qui change à partir du Standard c99?

Plutôt que de simplement des devis de la norme, je vous en seront reconnaissants si quelqu'un plonge plus profondément en eux et tente d'expliquer la sémantique impliqués.

Ce que je comprends, C11 fournit un soutien pour:

  • Création de Thread et de Gestion
  • Mutex
  • Variables Conditionnelles
  • Thread Spécifique de stockage et de
  • Atomique Objets

J'espère que je n'ai pas oublié quelque chose?
Depuis maintenant de la bibliothèque Standard fournit elle-même () toutes les fonctionnalités nécessaires pour le Multi-Threading, il n'y aurait pas besoin de POSIX et des bibliothèques(pour le support du Multi-thread) dans l'avenir?

Enfin, les compilateurs de fournir un soutien pour les caractéristiques mentionnées ci-dessus? Il y a aucune références du calendrier lorsque ceux-ci seront pris en charge?
Je me souviens de C++11, il y a un lien pour la prise en charge du compilateur et de fonctionnalités, peut-être quelque chose comme ça?

55voto

janneb Points 17303

Tout d'abord, ne pas écrire hors de C++11. La simultanéité de travail pour les nouvelles normes s'est faite sous le C++11 parapluie, puis importés dans C11 avec l'objectif explicite d'être compatible. Bien qu'il existe certaines différences syntaxiques (par exemple, en raison de la plaine C de ne pas avoir de modèles ou de surcharge de fonctions), sémantiquement, ils sont identiques de par leur conception. Pour "preuve" de ce, on peut vérifier le WG14 papiers. E. g:

et les références qui y sont. Plus peut être trouvé à Ouvrir Std Site Web

Maintenant, à vos questions:

Qu'est-ce que l'Amélioration de la mémoire de séquençage de modèle?

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

J'espère que je n'ai pas oublié quelque chose?

Avec le modèle de mémoire, votre liste semble porter sur la simultanéité des ajouts en C11. Pour les autres modifications, wikipédia a une liste; du haut de ma tête que je ne peux pas trouver quelque chose de wikipédia, liste de a raté.

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

Oui, il y aura un besoin pour eux. Tout d'abord, personne ne va réécrire tout le code existant qui utilise les différents thread existant de l'API. Deuxièmement, le C(++)11 bibliothèque de threads est/sera probablement mis en œuvre comme un wrapper autour de différents thread natif bibliothèques; heck, il ya même manière documentée pour récupérer un pointeur vers le sous-jacent thread natif, dans le cas où l'on doit faire quelque chose au-delà de ce que le C(++) bibliothèque de threads prend en charge. Penser le C(++)11 bibliothèque de threads plus comme un portable, plus petit dénominateur commun wrapper autour des différents thread natif bibliothèques.

Enfin, les compilateurs de fournir un soutien pour les caractéristiques mentionnées ci-dessus? Il y a aucune références du calendrier lorsque ceux-ci seront pris en charge?

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

7voto

Concernant l' What compilers provide support for the above mentioned features?


Pelles C prend en charge C11 <threads.h>. Création de threads avec Pelles C compilateur exemple:

#include <stdio.h>
#include <threads.h>

#define NUM_THREADS 7

static int threadData[NUM_THREADS];

int threadFunction(void * data) {
    printf("%d-th thread up\n", *(int*)data);
    return 0;
}

int main(void) {
    thrd_t threadId[NUM_THREADS];

    // init thread data
    for (int i=0; i < NUM_THREADS; ++i)
        threadData[i] = i;

    // start NUM_THREADS amount of threads
    for (int i=0; i < NUM_THREADS; ++i) {
        if (thrd_create(threadId+i, threadFunction, threadData+i) != thrd_success) {
            printf("%d-th thread create error\n", i);
            return 0;
        }
    }

    // wait until all threads terminates
    for (int i=0; i < NUM_THREADS; ++i)
        thrd_join(threadId[i], NULL);

    return 0;
}

EDIT: Éliminé fil de données partagée problème et le problème de la sortie de main() plus tôt que tous les fils se termine.

3voto

Jens Gustedt Points 40410

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

Enfin, les compilateurs de fournir un soutien pour le ci-dessus mentionné fonctionnalités? Il y a aucune références du calendrier lorsque ceux-ci seront pris en charge?

La famille des compilateurs gcc (bruit, de la cpi, opencc) prend en charge la plupart de la sémantique que la nouvelle norme exige, il y a seulement des différences syntaxiques. (clang même implémente _Generic dans la dernière version.)

Pour P99 j'ai écrit wrapper macros que la carte de la plupart des fonctions pour quelque chose qui est déjà C11 de syntaxe, d'ou vient près de lui (pour l'émulation _Generic).

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

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