Wie implementiere ich einen Wiedereintritts-Sperrmechanismus in Objective-C durch GCD?

Ich habe eine Objective-C-Klasse mit einigen Methoden, die eine GCD-Warteschlange verwenden, um sicherzustellen, dass gleichzeitige Zugriffe auf eine Ressource seriell erfolgen (Standardmethode hierfür).

Einige dieser Methoden müssen andere Methoden derselben Klasse aufrufen. Der Verriegelungsmechanismus muss also wieder einrasten. Gibt es eine Standardmethode, um dies zu tun?

Zuerst musste ich jede dieser Methoden anwenden

dispatch_sync(my_queue, ^{

   // Critical section

});

Zugriffe synchronisieren. Wie Sie wissen, tritt ein Deadlock auf, wenn eine dieser Methoden eine andere solche Methode aufruft, da der Aufruf dispatch_sync die aktuelle Ausführung anhält, bis dieser andere Block ausgeführt wird, der ebenfalls nicht ausgeführt werden kann, da die Ausführung in der Warteschlange angehalten wird. Um dies zu lösen, habe ich dann z.B. diese Methode:

- (void) executeOnQueueSync:(dispatch_queue_t)queue : (void (^)(void))theBlock {
    if (dispatch_get_current_queue() == queue) {
        theBlock();
    } else {
        dispatch_sync(queue, theBlock);
    }
}

Und in jeder meiner Methoden verwende ich

[self executeOnQueueSync:my_queue : ^{

   // Critical section

}];

Diese Lösung gefällt mir nicht, weil ich für jeden Block mit einem anderen Rückgabetyp eine andere Methode schreiben muss. Darüber hinaus scheint mir dieses Problem sehr verbreitet zu sein, und ich denke, es sollte eine schönere Standardlösung dafür geben.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage