Threading Test Frage

8

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%     
user834442 07.07.2011, 22:35
quelle

3 Antworten

9

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.

    
Yanir Kleiman 07.07.2011, 22:41
quelle
3

Es ist nicht threadsafe. An der markierten Zeile ist es möglich, dass die Dequeue-Methode von einem anderen Thread aufgerufen wird und somit die folgende Dequeue einen falschen Wert zurückgibt:

%Vor%

Der threadsichere Code wäre:

%Vor%     
platon 07.07.2011 22:43
quelle
2

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:

%Vor%

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.

    
Courtney Christensen 07.07.2011 22:41
quelle

Tags und Links