C++ function scoped static inicializáció + threadek

Fórumok

A következő kódot találtam egy cég termékében, amit használnunk kell:

static Objektum* Objectum::instance() {
static Objektum singletonVagyok;
return &singletonVagyok;
}

Ez szerintetek szabályos? GCC 4.4.valamivel lett fordítva, és bár az internet szerint ez szabályos, mert a gcc threadsafe kódot gyárt belőle (meg a C++0x-ben is állítólag threadsafe lesz), de a lefordított kód mégsem lett az...

Más találkozott már ilyennel? Nyilván egy jól irányzott mutex megoldotta a dolgot, de furcsáltam.

Üdv,
Gergely

Hozzászólások

Ez teljesen gáz így, ha MT környezetben akarod használni.

Ehelyett célszerű szerintem valami thread safe singleton template-et használni.

A butácska Borland C++ compiler is warning-ot dob ilyenekre:

"
W8104: Local Static with constructor dangerous for multi-threaded apps
This warning is generated for local static objects with constructors for multithreaded programs. This situation can cause problems if two threads enter the containing function at the same time and no critical sections are present, allowing the constructor to potentially be called more than once.
"

Nyilván nem voltam érthető:

1. Nem én írtam a kódot. Nem tanácsokat várok a jobb/szebb megoldásra. Tudok megoldást, implementáltam is.
2. Viszont gyakorlatilag mindenhol azt olvastam, hogy a GCC-ben ennek mennie kéne. Pl. itt is, ahol elvileg a C++0x-et készítik elő: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2513.html#Local
Viszont mégsem megy. Valaki találkozott már ezzel a problémával?
3. Ez a C++0x-ban teljesen legális lesz.

Üdv,
Gergely

Szabalyos, mivel jelenleg a C++ szabvany nem tul szoszatyar, ha threadekrol van szo ;). Az, hogy egyes forditok ebbol threadsafe kodot generalnak pusztan az adott fordito altal nyujtott manko. Erre a mankora elvileg a g++ hasznalatakor is lehet tamaszkodni, viszont ehhez az kell, hogy lehetoleg ne hasznald a "-fno-threadsafe-statics" kapcsolot ;) Ha megnezed a generalt assembly kodot szerepelnie kell a __cxa_guard_acquire/__cxa_guard_release parosnak, ez persze csak akkor igaz, ha nem egy POD osztalyrol van szo.

Multithreaded környezetben, több thread által használt static fából vaskarika. Majd a compiler csinál belőle valami threadsafe -t - lehet, de ilyet akkor sem tennék ha lehet!
(ha valami #pragma vagy más beállítóka van akkor még elmegy, de csak így odadobva ...)
Nincs ezen mit agyalni. Gondolom a te problémád az, hogy ki tudja mennyi ilyen van még abban a kódban? - ezt jól kifogtad, te szegény.

* Én egy indián vagyok. Minden indián hazudik.