2012-04-09 9 views
4

Ich habe einige Code wie folgt geerbt:Muss ich beim Aufruf von ResetEvent() Mutex oder sperren?

m_mutex.Lock(); 
ResetEvent(m_hSyncObject); 
m_mutex.Unlock(); 

Das Gleiche gilt für SetEvent()

diese Mutexes in diesem Fall notwendig sind - tun diese Anrufe verhalten sich oder kann ich weg mit der Schleusen zu entfernen? Diese Funktion hatte bereits einige Werte, die ich früher atomar gemacht habe und jetzt sind nur diese Ereignisse innerhalb der Sperren, also wäre es ein großer Gewinn wenn möglich, sie loszuwerden.

+2

Sie brauchen keinen zusätzlichen Mutex – 0xC0000022L

Antwort

2

Dieser zusätzliche Mutex ist fast sicher nicht erforderlich. Die ResetEvent und SetEvent-Funktionen selbst sind sicher aus mehreren Threads aufrufen

Vorausgesetzt, dass dieser Code vorhanden ist, scheint es sehr wahrscheinlich, dass der Entwickler, der diesen Code schrieb nicht die Threading-Semantik, die sie erstellt haben. Ich würde jeden Code, der von dieser Logik abhängt, als höchst verdächtig betrachten. Es würde Ihnen wahrscheinlich auf lange Sicht etwas Zeit ersparen, diesen Code für Threading-Probleme vorab zu prüfen.

+1

Schon überall. Profiler zeigte massive Aufrufe von "schnellen" Sperren. Job System misshandelte sie schlecht. Dies waren die letzten 2 Funktionen, die ich beim Sperren nicht wusste. Jetzt krieche ich um den Code herum, wie du es vorschlägst, und stelle sicher, dass alles andere so ist, wie es sein sollte ... –

+0

'Profiler zeigte massive Mengen von Anrufen zu' schnellen 'Sperren' - oh Liebes: ((Ich sympathisiere. –

1

Ereignisse sind atomar, so gibt es keine Notwendigkeit einer einen Mutex um SetEvent oder ResetEvent, zu verwenden es sei denn da ist noch etwas mit ihm zusammen und die beiden haben atomar durchgeführt werden (zB wenn Sie ein Ereignis gesetzt und eine andere zurückgesetzt).

+0

Nein, nichts dergleichen. Das Set und das Zurücksetzen befanden sich bereits in separaten kritischen Abschnitten, aber ich werde prüfen, ob sie nicht zusammengeschlossen werden sollten. Netter Vorschlag. –

1

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) .

Verwandte Themen