Critical Section - Frage
-
Hallo,
ich habe eine Frage zu Critical Sections.
Habe ich das so richtig verstanden:// Global variable CRITICAL_SECTION CriticalSection; int zaehler; int main( void ) { ... // Initialize the critical section one time only. if (!InitializeCriticalSectionAndSpinCount(&CriticalSection, 0x00000400) ) return; ... EnterCriticalSection(&CriticalSection); zaehler++; LeaveCriticalSection(&CriticalSection); // Release resources used by the critical section object. DeleteCriticalSection(&CriticalSection); } DWORD WINAPI ThreadProc( LPVOID lpParameter ) { ... // Request ownership of the critical section. EnterCriticalSection(&CriticalSection); // Access the shared resource. zaehler++; // Release ownership of the critical section. LeaveCriticalSection(&CriticalSection); ... return 1; }
Wird so mit Critical Sections richtig gearbeitet?
-
Ich sage mal: Ja.
-
Was muss grundsätzlich beachtet werden das es nicht zu einem "Deadlock" kommt?
-
Jap, sieht so falsch nicht aus. Allerdings könnte das ja auch einfach nur Zufall sein...
-
Der Code sieht vollkommen OK aus, obwohl man einen int nicht schützen muss. Da wäre ja auch InterlockedIncrement...
D0C schrieb:
Was muss grundsätzlich beachtet werden das es nicht zu einem "Deadlock" kommt?
Mit einer Critical Section kannst Du keinen Deadlock bekommen.
Problematisch wird es wenn Du mehrere Semaphoren, Events und Critical Sections hast und diese in unterschiedlichen Reihenfolgen aquiriert werden.Beispiel Du hast zwei Critical Sections CS1 und CS2
Thread 1 holt sich CS1
Thread 2 holt sich CS2
Thread 1 will CS2 und steht
Thread 2 will CS1 und steht nun ebenfalls: DEADLOCK!Wird immer nur ene CS benutzt ist alles gut, wird immer die Reihenfolge eingehalten, also wenn CS1 benötigt wird, dann wird diese zuerst geholt.
Sollte CS1 später benötigt werden und CS2 schon auqiriert sen, muss CS2 zuvor freigegeben werden, CS1 aquiriert und dann CS2...
Aber da gibt es einige nette Modelle.
Am Besten man arbeitet mit Verfahren wie Multiple Reader, Single Writer Mechansimen und begrenzt die Anzahl der Sperren auf ein Minimum.
Mehr Objekte heißt zwar oft weniger Konflikte, aber auch höhere Komplexität.