C globální statická - sdílena mezi závity?

hlasů
6

V jazyce C, deklarovat proměnnou statickou v globálním měřítku je to globální proměnné. Je to globální proměnné sdílena mezi závity nebo je přiděleno na vlákně?

Aktualizace: Pokud jsou sdíleny mezi závity, což představuje snadný způsob, jak globals do již existujícího knihovně unikátní na niti / nesdílená?

Update2: V podstatě, musím použít již existující C knihovnu globals ve vlákně-safe způsobem.

Položena 27/08/2009 v 05:28
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
16

Je to vidět na celý proces, tedy všechny závity. Samozřejmě, že to je v praxi. Teoreticky, jste nemohli říct, protože závity mají co do činění s normou C (přinejmenším až do C99, což je standard, který byl v platnosti, kdy byla tato otázka položená).

Ale všechny knihovny niti jsem kdy použil by musel globals které jsou přístupné všem závity.


Aktualizace 1:

Mnoho závit knihovny (pthreads, pro jednoho) vám umožní vytvářet údaje závitu specifické prostředky pro funkce pro vytváření a údajů o užívání specifických pro niti, aniž by to dědí z funkce.

Tak například funkce vrátit pseudo náhodných čísel chtít každé vlákno mít nezávislé semeno. Takže pokaždé, když je to jen to buď vytvoří nebo se připojuje k závitu pro konkrétní blok držící že osivo (pomocí nějaké klávesy).

To umožňuje funkce zachovat stejný podpis jako non-threaded ty (důležité v případě, že jsou funkce ISO C pro příklad), protože jiné řešení zahrnuje přidání ukazatel na funkci vlákno specifické nazývat.

Další možností je, že má řadu globals, z nichž každé vlákno dostane jeden , jako jsou:

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

To by umožnilo funkční vlákno, které mají být řečeno, které globální proměnné v poli k němu patří.

Existují i ​​jiné metody, není pochyb o tom, ale krátký znát vaše cílové prostředí, že to není moc smysl diskutovat o nich.


Aktualizace 2:

Nejjednodušší způsob, jak používat knihovnu non-thread-safe v závitové oblasti životního prostředí je poskytnout souhrnný hovory s ochranou mutex.

Řekněme například, že knihovna má non-thread-safe doThis()funkci. To, co děláte, je vytvořit obal pro něj:

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

Co se stane, je, že pouze jedno vlákno v době, bude moci uplatnit nárok na mutex (a tím i volání funkce non-thread-safe). Jiní budou blokovány, dokud je ten současný přiznání.

Odpovězeno 27/08/2009 v 05:30
zdroj uživatelem

hlasů
1

Jako @Pax zmíněno, statické proměnné jsou viditelné pro všechny závity. Neexistuje C ++ dat konstrukt spojen s určitým závitem.

Však v systému Windows můžete použít TlsAlloc API přidělit index pro dat vlákna specifická a dal, že index ve statickém proměnné. Každé vlákno má svůj vlastní slot, který lze přistupovat pomocí tohoto indexu a TlsGetValue a TlsSetValue. Pro více informací, přečtěte si Používání tématu místní úložiště na webu MSDN.

Aktualizace : Neexistuje žádný způsob, jak globals do již existujícího knihovny být thread-specifické. Jakékoli řešení by vyžadovalo, abyste upravit kód, jakož být vědomi toho, že data má závit afinitu.

Odpovězeno 27/08/2009 v 05:35
zdroj uživatelem

hlasů
1

C / C ++ standardní nepodporuje závity. Takže všechny proměnné sdílena mezi závity. Úložné provedena v C / C ++ runtime knihovny, která není součástí standardu. Runtime je specifické pro každý provedení C / C ++. Chcete-li psát přenosné kód v C ++ můžete použít Boost knihovny meziprocesové .

Deklarovat nit lokální proměnné v Microsoft Visual Studio, můžete použít Microsoft konkrétní klíčové slovo __declspec( thread ).

Odpovězeno 27/08/2009 v 05:34
zdroj uživatelem

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