Ich hatte vor kurzem eine Interviewfrage in einem Test, der dem unten ähnlich war, ich habe nicht sehr viel Erfahrung der Entwicklung mit Threads kann jemand bitte helfen, mir zu beraten, wie man sich dieser Frage nähert?:
%Vor%Ist die folgende Methode Thread sicher mit der obigen Implementierung und warum?
%Vor%Es scheint mir die Antwort ist nein.
Während die isEmpty () - Prozedur das Objekt sperrt, wird es freigegeben, sobald der Aufruf zurückgegeben wird - ein anderer Thread könnte möglicherweise DequeueOrNull () zwischen dem Aufruf von IsEmpty () und Dequeue () aufrufen (zu diesem Zeitpunkt ist das Objekt entsperrt), wodurch das einzige vorhandene Element entfernt wird, wodurch Dequeue () zu diesem Zeitpunkt ungültig wird.
Eine plausible Lösung wäre, die Sperre auf beide Anweisungen in DequeueOrNull () zu setzen, so dass kein anderer Thread DeQueue () nach der Überprüfung, sondern vor der DeQueue () aufrufen konnte.
Nein, weil sich der Status von _items
möglicherweise zwischen den threadsicheren IsEmpty()
und den threadsicheren Dequeue()
-Aufrufen ändern kann.
Fix es mit etwas wie folgt, die sicherstellt, dass _items
während der gesamten Operation gesperrt ist:
Hinweis: Abhängig von der Implementierung von _lock
möchten Sie vielleicht Vermeiden Sie die doppelte Sperrung der Ressource, indem Sie die Eingeweide von IsEmpty()
und Dequeue
in separate Hilfsfunktionen verschieben.
Tags und Links c# multithreading