CriticalSection+Threads
-
Hi!
Ich arbeite mit mehreren Threads und ich muss meine Variablen durch CriticalSections schützen.
Meine Klasse:class CCriticalSection { private: CRITICAL_SECTION m_csSection; public: CCriticalSection() { #if defined( _WIN32 ) && defined( _MT ) ::InitializeCriticalSection( &m_csSection ); #else #error ("No Multithreading") #endif } ~CCriticalSection() { #if defined (_WIN32) && defined (_MT) DeleteCriticalSection(&m_csSection); #else #error ("No Multithreading") #endif } void EnterSection() { #if defined (_WIN32) && defined (_MT) ::EnterCriticalSection( &m_csSection ); #else #error ("No Multithreading") #endif } void LeaveSection() { #if defined (_WIN32) && defined (_MT) ::LeaveCriticalSection( &m_csSection ); #else #error ("No Multithreading") #endif } };
void main() { CCriticalSection s; s.EnterSection(); s.EnterSection(); }
wieso hengt er beim zweiten EnterSection nicht unendlich???
er müsste eigentlich warten weil ich die kritische Region nicht verlassen habe (LeaveSection() nie aufgerufen) mit dem Debuger führt er einfach die Funktion aus wie wenn nichts wäre!
-
Ein Thread darf eine Critical Section beliebig oft betreten.
Nur wenn verschiedene Threads versuchen die Section gleichzeitig zu betreten werden sie blockiert.
Probiers mal mit 2 Threads, die beide die Critical Section nie wieder verlassen. Dann wirst du deinen Dead Lock haben.p.s.:
Aus dem platform sdk zu EnterCriticalSection:After a thread has ownership of a critical section, it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution. This prevents a thread from deadlocking itself while waiting for a critical section that it already owns.
Immer schön die Doku lesen.
-
Danke für die schnelle und fachliche Antwort!