Jsou funkční statické proměnné thread-safe v GCC?

hlasů
56

V příkladu kódu

void foo()
{
  static Bar b;
  ...
}

sestaven s GCC je to zaručeno, že bbude vytvořen a inicializován v thread-safe způsobem?

V manuálové stránky GCC, našel -fno-threadsafe-statiku možnost příkazového řádku:

Nevyzařují extra kód použít rutiny uvedené v C ++ ABI pro závit-safe inicializaci lokálních statiky. Můžete použít tuto možnost snížit velikost kódu mírně v kódu, který nemusí být thread-safe.

  1. Znamená to, že místní statika jsou thread-safe standardně s GCC? Takže není důvod, aby explicitní obranný např pthread_mutex_lock/unlock?

  2. Jak psát přenosné kód - jak zkontrolovat, zda kompilátor dodá své stráže? Nebo je lepší tuto funkci vypnout GCC?

Položena 13/08/2009 v 10:16
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
41

  1. No, to znamená, že inicializace místní statics je thread-safe.

  2. Budete určitě chtít opustit tuto funkci aktivoval. Inicializaci thread-safe místního staticS je velmi důležitá. Pokud potřebujete obecně thread-safe přístup k místním staticsekund, pak se budete muset přidat příslušný strážných sami.

Odpovězeno 13/08/2009 v 10:22
zdroj uživatelem

hlasů
17

Měli jsme vážné problémy s blokovací kód vygenerovaný GCC 3.4 pro ochranu místní statickou inicializaci. Tato verze používala globální sdílené mutex pro ochranu celého a statické inicializaci které vedou k zablokování našeho kódu. Měli jsme místní statickou proměnnou inicializovat z důvodu funkce, která byla zahájena další vlákno, které vytvořili místní statickou proměnnou. Pseudo kód:

voif f()
{
  static int someValue = complexFunction();
  ...
}
int complexFunction()
{
  start_thread( threadFunc() );
  wait_for_some_input_from_new_thread();
  return input_from_new_thread;
}
void threadFunc()
{
  static SomeClass s();
  ...
}

Jediným řešením bylo, aby tuto funkci vypnout gcc. Pokud budete potřebovat svůj kód, aby byly přenositelné, což jsme udělali, nemůžete vlastně závisí na funkce přidané v konkrétní gcc verze pro bezpečnost závitu. Údajně C ++ 0x přidává thread-safe místní statika, do té doby je to nestandardní magic který dělá váš kód non-přenosné, takže jsem radí proti němu. Pokud se rozhodnete používat, navrhuji, abyste ověřili, že vaše gcc verze nepoužívá jednotnou globální mutex pro tento účel tím, že píše ukázkové aplikace. (Obtížnost niti bezpečnosti je zřejmé ze skutečnosti, že i gcc nemůže to dopadnout dobře)

Odpovězeno 03/10/2009 v 19:03
zdroj uživatelem

hlasů
6

To není ve skutečnosti odpovědí na vaše otázky ihned ( Charles už to udělal ), ale myslím, že je čas poslat odkaz na tento článek znovu. To vrhá světlo na inicializaci globals a je třeba číst a rozumět všem pokouší použít staticproměnné prostředí multi-threaded.

Odpovězeno 13/08/2009 v 10:43
zdroj uživatelem

hlasů
5

Myslím, že klíčové fráze je

... thread-safe inicializace lokálních statiky.

Četl jsem to v tom smyslu, že se jedná pouze inicializace statiky, který by být provedeno v thread-safe způsobem. Obecné použití statiky by neměl být thread-safe.

Odpovězeno 13/08/2009 v 10:24
zdroj uživatelem

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