C statica globale - condiviso tra i thread?

voti
6

In C, dichiara una variabile statica nell'ambito globale rende una variabile globale. È questa variabile globale condivisa tra thread o è allocata per thread?

Aggiornamento: Se sono condivisi tra le discussioni, che cosa è un modo semplice per fare globali in una libreria preesistente unica per una discussione / non condivisa?

Update2: Fondamentalmente, è necessario utilizzare una libreria preesistente C con globali in un modo thread-safe.

È pubblicato 27/08/2009 alle 05:28
fonte dall'utente
In altre lingue...                            


3 risposte

voti
16

E 'visibile l'intero processo, vale a dire, tutti i fili. Naturalmente, questo è in pratica. In teoria, non si poteva dire, perché le discussioni non hanno nulla a che fare con lo standard C (almeno fino a C99, che è lo standard che era in vigore quando questa domanda è stato chiesto).

Ma tutte le librerie di thread che abbia mai usato avrebbero globali accessibili a tutte le discussioni.


Aggiornamento 1:

Molte biblioteche filo (pthreads, per uno) vi permetterà di creare i dati specifici del thread, un mezzo per funzioni per creare e utilizzare dati specifici per il filo senza averlo tramandata attraverso la funzione.

Così, per esempio, una funzione per tornare pseudo numeri casuali può decidere ogni thread per avere un seme indipendente. Così ogni volta che si chiama neanche crea o si attacca ad un blocco specifico thread tenendo quel seme (utilizzando una sorta di chiave).

Ciò consente le funzioni di mantenere la stessa firma quelli non filettati (importante se sono funzioni ISO C per esempio) poiché l'altra soluzione comporta l'aggiunta di un puntatore specifico filo alla funzione chiamare stessa.

Un'altra possibilità è quella di avere una serie di variabili globali di cui ogni filo ottiene uno , come ad esempio:

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) {
        : : :
    }
}

Ciò consentirebbe la funzione filo da detto che variabile globale nella matrice appartiene ad esso.

Ci sono altri metodi, senza dubbio, ma a corto di conoscere il vostro ambiente di destinazione, non c'è più molto senso discuterne.


Update 2:

Il più semplice modo per utilizzare una libreria non-thread-safe in un ambiente filettato è quello di realizzare chiamate involucro con protezione mutex.

Ad esempio, dire la vostra biblioteca ha un non-thread-safe doThis()funzione. Quello che fai è fornire un wrapper per esso:

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

Cosa accadrà è che solo un thread alla volta potrà richiedere il mutex (e quindi chiamare la funzione non-thread-safe). Altri saranno bloccati fino a quando la corrente si ritorna.

Risposto il 27/08/2009 a 05:30
fonte dall'utente

voti
1

Come detto @Pax, variabili statiche sono visibili tutti i filetti. Non c'è costrutto dati C ++ associato a un particolare thread.

Tuttavia, in Windows è possibile utilizzare il TlsAlloc API per assegnare un indice per dati specifici filo e mettere tale indice in una variabile statica. Ogni thread ha il proprio alloggiamento cui si può accedere usando questo indice e il TlsGetValue e TlsSetValue. Per ulteriori informazioni, leggere Utilizzando Thread Local Storage su MSDN.

Aggiornamento : Non c'è modo per rendere globali in una libreria preesistente essere thread-specifica. Tutte le soluzioni che richiedono di modificare il codice e di essere a conoscenza che i dati ha affinità di thread.

Risposto il 27/08/2009 a 05:35
fonte dall'utente

voti
1

Standard C / C ++ non supporta thread. Quindi, tutte le variabili condivise tra i thread. Supporto Discussione implementato in C C ++ runtime library / che non fa parte dello standard. Runtime è specifico per ogni implementazione di C / C ++. Se si desidera scrivere codice portabile in C ++ è possibile utilizzare libreria tra processi spinta .

Per dichiarare filo variabile locale in Microsoft Visual Studio è possibile utilizzare Microsoft specifica parola chiave __declspec( thread ).

Risposto il 27/08/2009 a 05:34
fonte dall'utente

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