Frage

Ich frage mich, wie man bei der Laufzeit sicher ändert, die Eventwaithandle, auf die ein Thread warten sollte.

Angenommen, zum Beispiel, dass zwei Threads (A und c) vorhanden sind, die durch Eventwaithandles synchronisiert sind. A tat seine Arbeit zyklisch und c wartet, bis er die Benachrichtigung von einem erhielt, von dem er anfangen kann, seinen Job zu tun (z. B. vom AutoretEvent). Das Muster ist a-c-a-c ...

später auf einem neuen Thread (B) wird gestartet (z. B. durch Benutzeraktion), und sein Job sollte auf diese Weise zwischen den beiden reexistenten Threads ausgeführt werden: A macht seinen Job, dann signalisiert B und einmal B . Nun ist das Muster abcabc ...

Bevor der Thread C auf den mit einem gemeinsam genutzten Eventwaithandle wartete, sollte es einen sicheren Mechanismus geben, der C wartet, um auf einem anderen Eventwaithandle zu warten, der mit B teilgenommen hat. Sobald dies geschehen ist, sollte ich leicht b in der Lage sein, b auf dem Laufenden eines EventwaitHandle auf einen Job zu starten, um auf einem Job zu warten, und ein Eventwaithandle zum Signal für den C-Job. Der Mechanismus sollte auch einen Weg bereitstellen, den Thread B sicher zu montieren und in die ursprüngliche Situation zurückzukehren, in der nur Thread A und C arbeiten.

Gibt es einen sicheren Weg, dies mit Eventwaithandle zu erreichen? Wenn nicht, wäre jeder andere Vorschlag geschätzt.

War es hilfreich?

Lösung

If task A knows about the change, then have task C own the event. Task A signals task C's event if C is to be next, or task B's event if task B is to be next.

Alternatively, use the same mechanism as for changing any other shared data: acquire a mutex across all accesses to the handle. e.g. task C acquires the lock, reads the handle, releases the lock, waits on the handle. To change it you have the UI thread acquire the lock, change the handle, release the lock.

Andere Tipps

Have you thought about implementing some sort of scheduler where the threads can register (deregister) with a handle to start and to signal completion. And the scheduler then takes care of starting the next thread by setting the appropriate start-event and continues with the next thread, when the previous one has set the completion event.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top