我有一個Objective-c類的一些方法,它使用GCD隊列來確保對資源的併發訪問是以串行方式進行的(標準方式)。如何通過GCD實現objective-c中的折返鎖定機制?
其中一些方法需要調用同一類的其他方法。所以鎖定機制需要重新進入。有沒有一個標準的方法來做到這一點?
起初,我不得不每一種方法使用
dispatch_sync(my_queue, ^{
// Critical section
});
同步訪問。如你所知,當其中一個方法調用另一個這樣的方法時,會發生死鎖,因爲dispatch_sync調用會停止當前正在執行的內容,直到該另一個塊被執行,這也不能執行,因爲隊列上的執行被停止。爲了解決這個問題,我使用了例如這個方法:
- (void) executeOnQueueSync:(dispatch_queue_t)queue : (void (^)(void))theBlock {
if (dispatch_get_current_queue() == queue) {
theBlock();
} else {
dispatch_sync(queue, theBlock);
}
}
而且在每一個我的方法,我用
[self executeOnQueueSync:my_queue : ^{
// Critical section
}];
我不喜歡這樣的解決方案,因爲對於不同的返回類型中的每個塊,我需要寫的另一種方法。而且,這個問題對我來說很常見,我認爲應該有一個更好的標準解決方案。
您是否考慮過使用'@ synchronized'呢? –
@MartinR,是的,但'@ synchronized'是一個經典的鎖,不是基於GCD /隊列,因此,據我所知,由於代碼簡單和性能的原因,它是不鼓勵使用它。這個問題的標題因此具有誤導性,因爲它包含「鎖定」。我的意思是以可重入的方式與GDC /隊列同步訪問。我沒有比說「可重入鎖定」更好的詞,因爲這是大多數人都知道的問題解決方案的名稱。 –
@MartinR,而且'@ synchronized'的優點是可以簡化代碼重入 - 無論如何(這怎麼稱得上最好?)。儘管如此,它背後的鎖定機制比GCD隊列背後的機制性能要差一些。 –