2011-01-13 14 views
1

Wenn ein Ereignis (erstellt mit ::CreateEvent(...)) zum Beenden eines Threads verwendet wird, muss dieses Ereignis (::ResetEvent(...)) zurückgesetzt werden, bevor der Thread beendet oder das Event-Handle (::CloseHandle(...)) geschlossen wird? Oder ist es eine gute Übung, wenn es eine Möglichkeit gibt, dass der Thread neu gestartet wird? Dies ist für eine Windows-Umgebung. Vielen Dank.Thread-Exit-Ereignisse - C++

+0

Bitte präzisieren. I.e. Irgendein Code würde helfen. Die einzige bewährte Methode, die ich kenne, ist, dass Sie sicherstellen sollten, dass :: CloseHandle für den Ereignis-Handle aufgerufen wird, sobald das Ereignis nicht mehr benötigt wird, und vergewissern Sie sich, dass Sie das Ereignis nicht später verwenden – ds27680

Antwort

2

Es hängt von der Semantik des von Ihnen verwendeten Ereignisses ab.

Wenn Sie das Ereignis verwenden, um mehr als einen Thread zum Absturz auszulösen, sollten Sie das Ereignis nicht in jedem Thread zurücksetzen. Wenn Sie damit nur einen Thread zum Absturz bringen, dann kommt es wiederum auf weitere Semantiken an. Wenn das Ereignis verwendet wird, um andere Dinge anderen Threads zu signalisieren, müssen Sie das Ereignis im ding-Thread zurücksetzen. Andernfalls, wenn das Ereignis nur verwendet wird, um einem einzelnen Thread zu signalisieren, dass es stirbt, und nichts anderes, können Sie das Ereignis zurücksetzen oder nicht. Nichts anderes wird als Folge der Signalisierung des Ereignisses aufwachen.

Sie müssen kein Ereignis zurücksetzen, um Ressourcenlecks zu vermeiden. Alles, was Sie tun müssen, ist CloseHandle()

3

Das Zurücksetzen des Ereignisses ist nicht erforderlich, da beim Schließen des Handle das zugehörige Ereignis nicht mehr gültig ist.

0

Es ist nicht erforderlich, den gesetzten Zustand des Ereignisses vor dem Schließen seines Griffs zu spiegeln. Um weiter zu erklären, ist der gesetzte Zustand des Ereignisses unabhängig von seiner Existenz. Wie Ihnen wahrscheinlich bekannt ist, können Sie mit der Funktion CreateEvent (...) den Anfangszustand des Ereignisses festlegen. Also, wenn Sie es als Set initialisieren, sollten Sie sicher sein, dass es vor CloseHandle() gesetzt ist? Nein, natürlich nicht, der gesetzte Zustand ist völlig belanglos. Es ist ähnlich, die Mitglieder einer Klasse in ihren Ausgangszustand zurückzusetzen, bevor sie zerstört werden.