InitializeCriticalSection
-
Hallo zusammen!
Ich würde gerne mit critical sections meine DLL threadsicher machen.
Jetzt muss ich aber ja zuerst mit "InitializeCriticalSection" ein critical section object initialisieren.
Ich brauche dieses Object aber sofort als globales Object.
Kennt da jemand ein Macro, mit dem ich das gleich als globales Object definieren und initialisieren kann?
Unter Unix gab es da ja sowas aber unter Windows ist mir leicher nichts bekannt.Für Tipps wäre ich dankbar
mfg Tom
-
Bau Dir doch eine eigene Klasse, die das im Konstruktor macht.
Oder verwende die ATL...
BTW: Warum brauchst Du das als globales Objekt und gleich? Dnan hast Du evtl. ein Problem einer Race Condition. In diesem Fal müsstest Du ein Singleton Pattern verwenden.
-
Was bitte ist eine Race Condition?
Ich denke ich implementiere einfach die DLLMain Function und initialisiere das bei DLL_PROCESS_ATTACH und gebe es bei DLL_PROCESS_DETACH wieder frei. Oder ist davon abzuraten?
-
http://de.wikipedia.org/wiki/Race_Condition
habs gefunden
-
Wenn ich das critical section Object global habe, dann sollte es doch keine race condition geben da ich mal davon ausgehe, dass der Zugriff auf diese spezielle globale Ressource synchron verläuft. Sonst wurde es doch keinen Sinn machen oder?
-
ähm, ich mag mich ja irren^^
aber wenn die Critical-Section global ist, und deine DLL mehrere
verschiedene Klassen exportiert (von mir aus class foo und class bar)
und beide haben verwenden die critical section zur Synchronisation.Dann würde ein Programm ein Object von foo und eins von bar haben.
der eine Thread schreibt in bar was sehr großes.
der andere will mal was in foo reinschreiben.
normalerweise sollte das kein Problem darstellen, ist ja nicht das gleiche Object...
aber bei dir wird der Zugriff auf foo warten müssen, bis der Zugriff auf bar fertig ist.also verpass lieber jeder Klasse eine nichtstatische CRITICALSTECTION, die im Kostruktor initialisiert
und im Destruktor wieder zerstört wird.
-
Es entsteht schon eine Race-Condition (evtl. der falsche Begriff) die in der Reihenfolge der Konstruktion der Objekte liegt. Warum muss das Ding gobal sein? Vermutlich weil Du es global benutzen möchtest, also auch in anderen Konstruktoren.
Die Initialisierung der Variablen selbst ist geblockt. Nur ein Prozess kann DLL-Main ausführen...
-
Diese DLL ist in C programmiert. Das ist recht alter Code, vollgestopft mit globalen Variablen von dene ich mittlerweise einige lokal gemacht habe. Jetzt soll das ganze Thread-Save gemacht werden. Synchronisiert werden muss ein COM-Port (Hier wird geschrieben und danach etwas gelesen, das ist ein kritischer Bereich, weil kein anderer Thread da reinfunken darf) und es soll der Zugriff auf eine globale Collection syhnronisiert werden (Hier werden Messwerte verwaltet. Ich hatte eben gedacht, ich definier dafür 2 globale Synchronisationsobjekt, die ich in DLLMain initialisiere und auch wieder zerstöre. Ist das denn keine gute Idee? Ich dachte eigentlich, dass das so funktionieren müsste