dispatch_sync-Aufruf in einen disass_async-Aufruf

7

Ich habe einige Zweifel über das Verhalten dieses Codes:

%Vor%

Von diesen Zeilen erwartete ich als Ausgabe step1 -> step3 -> step2 , aber ich erhalte nur step1 .

Wenn ich dispatch_sync mit dispatch_async ändere, funktioniert es wie erwartet, erzeugt dispatch_sync in einen dispatch_async-Aufruf diese Art von Problem?

Nach Antworten bearbeiten ----------------

Dieser Fall erstellt einen Deadlock:

Sie können die akzeptierte Antwort überprüfen, um eine Erklärung zu dieser Situation zu erhalten, und diesen Link für die Dokumentation überprüfen Ссылка

    
MatterGoal 29.12.2011, 13:42
quelle

2 Antworten

21

Das ist ein Deadlock.

Der Aufruf dispatch_sync wartet, bis queue verfügbar ist, bevor der Block ausgeführt und zurückgegeben wird, aber das ist erst verfügbar, wenn dispatch_async beendet ist. Er wird also nur dort sitzen und warten, bis er dispatch_sync aufruft. .

    
mattjgalloway 29.12.2011, 13:44
quelle
1

Wie von @mattjgalloway erwähnt, ist es ein Deadlock.

Apples eigene Dokumentation erwähnt das Problem hier: Ссылка (siehe "RECURSIVE LOCKS"). Es wird im Zusammenhang mit rekursiven Sperren diskutiert, aber das Prinzip ist das gleiche.

    
Monolo 29.12.2011 14:16
quelle