Ich habe eine Liste von Themen, und ich versuche, meinen Haupt-Thread zu bekommen für alle Threads in der Liste warten zu beenden:Gibt es eine Möglichkeit, die Existenz von Listenelementen und Aufrufmethoden für Listenelemente automatisch zu überprüfen?
while (consumers.Count > 0) consumers[0].Join();
Das Problem ist, das ist nicht atomar ist, und Ich kann eine Ausnahme "Index war außerhalb des zulässigen Bereichs" erhalten.
Gibt es einen atomaren Weg, um die Existenz von Verbrauchern [0] zu überprüfen und Verbraucher [0] .Join() anzurufen?
Hinweis: Ich kann nicht
lock (myLocker) { if (consumers.Count > 0) consumers[0].Join(); }
tun, weil ich will nicht den Zugriff auf Verbraucher die anderen Threads blockieren, während stecken in Join().
Außer meiner Kopie wäre sofort abgestanden. Ich stelle mir thread.Join() würde fehlschlagen, wenn der Thread bereits beendet wurde? – mbeckish
Alle anderen Zugriffe auf die Verbraucher sind synchronisiert. Lassen Sie es mich wissen, wenn Sie einen anderen Code sehen würden. – mbeckish
@mbeckish: Ihre Kopie wird immer * sofort * abgestanden sein, sobald Sie darauf zugegriffen haben - und Ihre Intuition über Thread.Join ist falsch, wie dokumentiert: "Wenn der Thread bereits beendet wurde, wenn Join aufgerufen wird, kehrt die Methode sofort zurück." Vorausgesetzt, dass Sie nicht atomar "Thread-Status überprüfen und Join verbinden" können, wird jede Join-API, die eine Ausnahme auslöst, wenn der Thread bereits beendet wurde, vom Entwurf getrennt. –