Critical_Section
-
Hallo,
ich hab eine statische Klasse (nur statísche Methoden und Member). Diese möchte ich threadsafe mit Hilfe von Critical_Section gestalten. Allerdings weiß ich nicht genau wie ich die CS initialisieren soll. Die CS soll am besten auch eine statische Member der Klasse sein.
Sowas in der Richtung funktioniert ja nicht:
void Class::initCS() { if (!m_isinit) { InitializeCriticalSection(&m_cs); EnterCS(&m_cs); m_isinit=true; LeaveCS(&m_cs); } }Hat jemand eine Idee oder noch besser die Lösung?
-
Abgesehen davon, dass du eine race condition drin hast, wieso soll es nicht funktionieren?
-
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.