Critical_Section
-
Es könnte ja passieren, dass m_cs zweimal initialisiert wird (falls ein Threadwechsel stattfindet, bevor EnterCS ausfgerufen wurde).
race condition?? was meinst du damit?
-
Genau das.
Du musst halt einfach nach dem EnterCS nochmal schauen, ob die Variable wirklich noch immer false ist. Nur dann machst du die Initialisierung.
-
Danke für deine Antwort.
Könntest du mir mal ein Beispiel liefern?
Gibt es keine elegantere Möglichkeit statische Klassen threadsafe zu gestalten?
-
*bitte*
-
mach das 'Initialize' besser woanders, also bevor die threads ausgeführt werden, die die cs benutzen
-
So kann's überhaupt nicht funktionieren, seh ich grad. Irgendein Synchronisationskonstrukt musst du auf jeden Fall initialisieren, bevor zwei oder mehr Threads im Spiel sind.
-
Liese sich dazu nicht InterlockedCompareExchange verwenden?!

-
Kannst du das mal genau erläutern? Vielleicht ein wenig Code?
Vielen Dank.
-
Ich habe damit auch keine praktische Erfahrung, hatte mir das aber irgendiwe so gedacht (ungetestet):
LONG m_isinit = 0; if (!InterlockedCompareExchange(&m_isinit,1,0)) { InitializeCriticalSection(&m_cs); }
-
Danke.
Aber so könnte sein, dass ein Thread die CS-Struktur nutzt ohne, dass diese initialisiert ist ...
Oh mann ... was ist nun die beste Lösung?
Keiner mehr eine Idee?
-
Wiseo denn das? Du machst einfach m_isinit und die CRITICAL_SECTION-Struktur static und führst dann den obenstehenden Code im Konstruktor aus - da sollte dann eigentlich nichts passieren

-
du könntest eine statische critical section auch statisch initialisieren lassen:
static bool initialized = initialize();
static bool initialize()
{
InitializeCriciticalSection(§ion);
return true;
}
-
@flenders: Doch meiner Meinung nach schon. Es ist nicht sicher.
@Orp: Danke, ich glaube auch, dass das die einzige Lösung ist.