C statique global - partagé entre les threads?

voix
6

En C, déclarant dans le cadre global d'une variable statique permet une variable globale. Est-ce variable globale partagée entre les threads ou est-il attribué par fil?

Mise à jour: Si elles sont partagées entre les threads, ce qui est un moyen facile de faire GLOBALS dans une bibliothèque pré-existante unique à un fil / non partagé?

Update2: En fait, je dois utiliser une bibliothèque pré-existante avec C GLOBALS d'une manière thread-safe.

Créé 27/08/2009 à 05:28
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
16

Il est visible à l'ensemble du processus, à savoir, toutes les discussions. Bien sûr, cela est en pratique. En théorie, on ne pouvait pas dire que les discussions ont rien à voir avec la norme C (au moins jusqu'à C99, qui est la norme qui était en vigueur au moment posé cette question).

Mais toutes les bibliothèques de fil que j'ai jamais utilisé aurait GLOBALS accessibles à toutes les discussions.


Mise à jour 1:

De nombreuses bibliothèques de fil (pthreads, pour un) vous permettra de créer des données spécifiques au thread, un moyen de fonctions pour créer et utiliser des données spécifiques au fil sans l'avoir passé à travers la fonction.

Ainsi, par exemple, une fonction de retour pseudo nombres aléatoires peut vouloir chaque thread d'avoir une graine indépendante. Donc, chaque fois qu'il est appelé soit crée ou se fixe à un bloc spécifique fils tenant que les semences (en utilisant une sorte de clé).

Cela permet aux fonctions de maintenir la même signature que les non-thread (important si elles sont fonctions ISO C par exemple) puisque l'autre solution consiste à ajouter un pointeur thread spécifique à la fonction elle-même appel.

Une autre possibilité est d'avoir un tableau de GLOBALS dont chaque fil reçoit une , par exemple:

int fDone[10];
int idx;
: : :
for (i = 0; i < 10; i++) {
    idx = i;
    startThread (function, i);
    while (idx >= 0)
        yield();
}

void function () {
    int myIdx = idx;
    idx = -1;
    while (1) {
        : : :
    }
}

Cela permettrait à la fonction de fil à dit que variable globale dans le tableau qui lui appartient.

Il existe d'autres méthodes, sans doute, mais peu de connaître votre environnement cible, il n'y a pas grand-chose de les discuter.


Mise à jour 2:

La meilleure façon d'utiliser une bibliothèque non-thread-safe dans un environnement fileté est de fournir des appels wrapper avec protection mutex.

Par exemple, supposons que votre bibliothèque a un non-thread-safe doThis()fonction. Ce que vous faites est de fournir une enveloppe pour elle:

void myDoThis (a, b) {
    static mutex_t serialize;
    mutex_claim (&serialize);
    doThis (a, b);
    mutex_release (&serialize);
}

Que se passera-t il y a qu'un seul thread à la fois sera en mesure de réclamer le mutex (et donc appeler la fonction non-thread-safe). D'autres seront bloquées jusqu'à ce que l'actuel rendement.

Créé 27/08/2009 à 05:30
source utilisateur

voix
1

Comme mentionné Pax, variables statiques sont visibles pour tous les sujets. Il n'y a pas de données C ++ construction associée à un fil particulier.

Cependant, sous Windows , vous pouvez utiliser l' TlsAlloc API pour attribuer l' index pour des données spécifiques au fil et mettre cet indice dans une variable statique. Chaque thread a son propre emplacement que vous pouvez accéder à l' aide de cet indice et le TlsGetValue et TlsSetValue. Pour plus d' informations, lire sur comment utiliser du fil de stockage local sur MSDN.

Mise à jour : Il n'y a pas moyen de faire dans une bibliothèque GLOBALS pré - existante est spécifique à fil. Toutes les solutions auriez - vous besoin de modifier le code aussi bien être conscient que les données a une affinité de fil.

Créé 27/08/2009 à 05:35
source utilisateur

voix
1

Le standard de C / C ne supporte pas les fils. Donc , toutes les variables partagées entre les threads. Le support des threads mis en œuvre dans la bibliothèque d' exécution C / C ++ qui ne fait pas partie de la norme. Runtime est spécifique pour chaque mise en œuvre de C / C ++. Si vous voulez écrire du code portable en C ++ , vous pouvez utiliser la bibliothèque interprocessus boost .

Pour déclarer fil variable locale dans Microsoft Visual Studio vous pouvez utiliser mot clé spécifique Microsoft __declspec( thread ).

Créé 27/08/2009 à 05:34
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more