Mutex für kritische Bereiche
-
Mutex und CS unterscheiden sich extrem. Ein Mutex ist ein Kernel-Objekt eine CS nicht.
Ein Mutex ist extrem langsamer als eine CS, besonders wenn es nciht zu einer Kollision kommt.
-
hab jetzt zwar alles schon mit Mutex gemacht, aber vielleicht steige ich ja auch noch um, obwohl es bei so einem kleinen Programm doch nicht so viel aus machen sollte.
Vielleicht hast du ja mal einen Seite, wo ich ir beide mal im Vergleich anschauen kann. Und zudem wie ich die CS handhabe, ist das genauso einfach wie ein Mutex?
-
Es ist viel einfacher.
Bzw. wenn die die MFC verwendest genauso.CCriticalSection critical; ... void TuWasKritisches() { CSingleLock lock(&critical,TRUE); ... }
-
Danke.
Wie gebe ich "critical" wieder frei?
-
Das macht doch der Destruktor von CSingleLock?
Wie arbeitest Du denn aktuell mit CMutex?
-
Hier mal ein Bsp.:
HANDLE hMutex = CreateMutex(NULL,FALSE,"MeinMutex"); void TuWasKritisches() { WaitForSingleObject(hMutex, INFINITE); ... ReleaseMutex(hMutex); }
-
Aho! Also pur Windows API.
Warum postest Du dann hier im MFC Forum? Die MFC hat geniale Wrapperklassen für diese ganzen Sachen. Auch das würde sich mit CSingleLock und CMutex direkt erledigen lassen.
-
Ohh, hatte gar nicht bemerkt, dass ich im falschen Forum bin...
-
Aber CS kann ich doch bei WinAPI auch nutzen, oder?
-
Aber sicher!
-
Wie würde es denn dort aussehen, im Vergleich zur MFC?
-
Wenn du ne CRITICAL_SECTION statt einer Mutex verwenden willst, dann musst du bloss ein paar Aufrufe ersetzen:
WaitForSingleObject(mutexHandle, INFINITE); // -> EnterCriticalSection(&criticalSection); ReleaseMutex(mutexHandle); // -> LeaveCriticalSection(&criticalSection); BOOL locked = (WaitForSingleObject(mutexHandle, 0) == WAIT_OBJECT_0); // -> BOOL locked = TryEnterCriticalSection(&criticalSection);Initialisieren/freigeben:
CRITICAL_SECTION g_myCriticalSection; // Initialisieren: InitializeCriticalSection(&g_myCriticalSection); // oder: BOOL success = InitializeCriticalSectionAndSpinCount(&g_myCriticalSection, 1000); // 1000 is der Spin-Count, kannste den Wert auch ändern, aber 1000 sollte OK sein // - um nen besseren Wert zu finden müsste man mit der endgültigen Anwendung experimentieren (Geschwindigkeit mit verschiedenen Spin-Counts messen) // Freigeben: DeleteCriticalSection(&g_myCriticalSection);