Ich habe eine Objective-C Klasse mit einigen Verfahren, die eine GCD Warteschlange verwenden, die gleichzeitigen Zugriffe auf eine Ressource erfolgen, um sicherzustellen, seriell (standard Art und Weise, dies zu tun).Wie implementiert man einen Wiedereintrittssperrmechanismus in Ziel-c durch GCD?
Einige dieser Methoden müssen andere Methoden der gleichen Klasse nennen. Also muss der Verriegelungsmechanismus einspringend sein. Gibt es einen Standard Weg dies zu tun?
Zunächst musste ich jede dieser Methoden verwenden
dispatch_sync(my_queue, ^{
// Critical section
});
Zugriffe zu synchronisieren. Wie Sie wissen, tritt eine Deadlock auf, wenn eine dieser Methoden eine andere Methode aufruft, da der Aufruf dispatch_sync die aktuelle Ausführung stoppt, bis dieser andere Block ausgeführt wird, der auch nicht ausgeführt werden kann, weil die Ausführung in der Warteschlange gestoppt 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 jedem meiner Methoden, verwende ich
[self executeOnQueueSync:my_queue : ^{
// Critical section
}];
ich diese Lösung nicht gefällt, weil für jeden Block mit einem anderen Rückgabetyp, muss ich eine andere Methode schreiben. Darüber hinaus scheint dieses Problem sehr häufig zu sein und ich denke, dass es eine schönere Standardlösung dafür geben sollte.
Haben Sie erwogen, stattdessen '@ synchronized' zu verwenden? –
@MartinR, ja, aber '@ synchronized' ist eine klassische Sperre, die nicht auf GCD/Queues basiert, und aus diesem Grund ist es aus Gründen der Einfachheit und Leistung des Codes nicht ratsam, sie zu verwenden. Der Titel dieser Frage ist daher irreführend, weil er "lock" enthält. Was ich meine, ist die Synchronisierung des Zugriffs in einer reentranten Weise mit GDC/Warteschlangen. Ich hatte einfach keine besseren Worte als "Reentrant Locking" zu sagen, denn das ist der Name der Lösung für das Problem, die die meisten Leute kennen. –
@MartinR, obwohl '' synchronisiert ''hat den Vorteil, zu einfacheren Code für Reentrant -was- (wie man das am besten nennen?) Zu führen. Dennoch hat der Sperrmechanismus hinter ihm weniger Leistung als der Mechanismus hinter GCD-Warteschlangen. –