Caveat programmer!
Ereignisse mit manueller Zurücksetzung sind schwierig zu verwenden und erfordern möglicherweise, dass Sie eine Sperre für das Setzen und Zurücksetzen des Ereignisses festlegen (Ereignisse mit automatischer Zurücksetzung erleichtern das Vermeiden dieser Probleme).
Betrachten Sie diesen Code:
Worker() {
WaitForSingleObject(hEvent);
DoWork();
ResetEvent(hEvent);
}
EventThread() {
QueueWork();
SetEvent(hEvent);
}
Es ist möglich, mit rassiger Verschachtelung für die Arbeiter das Ereignis nach die EventThread zurückgesetzt signalisiert hat, die die Arbeitnehmer verursacht zu hängen, wenn er wartet. Um das Ereignis "manuelles Zurücksetzen" in diesem Fall ordnungsgemäß zu verwenden, müssen Sie eine Sperre für das Ereignis "Zurücksetzen" erstellen und den Status der Warteschlange atomisch überprüfen, indem Sie das Ereignis zurücksetzen.
Auto-Reset-Ereignisse lassen Sie atomar aufwachen und das Ereignis zurücksetzen, das dieses Rennen vermeidet (Sie könnten eine zusätzliche Zeit aufwachen, wenn Sie bereits die Warteschlange abließen, wenn Arbeit kam, aber Sie werden keine Wakes verpassen) .
Sie brauchen keinen zusätzlichen Mutex – 0xC0000022L