2012-10-07 66 views
13

我是一位經驗豐富的.NET程序員,用iOS伸展雙腿。我最喜歡的.NET中的多線程結構是ReaderWriterLock。它允許多個讀者或一個作家。 iOS中真正缺少的一個特性是鎖可重入。也就是說,只要他們釋放相同的次數,就可以使用reader threads can acquire the read lock multiple times。同樣,只要單個寫入程序線程釋放相同數量的鎖,就可以多次獲取該鎖。重入讀/寫鎖定結構?

我已經研究過iOS框架,並且沒有一個構造似乎提供相同的支持,包括重新入侵。我也看了一下pthread庫。我發現了rwlock,但它不允許重新進入。

iOS上有什麼允許重入讀寫鎖的東西嗎?

回答

2

從iOS Threading Programming Guide

系統支持只使用POSIX線程讀寫鎖。有關如何使用這些鎖的更多信息,請參閱pthread手冊頁。

所以我想如果pthreads不支持再次入侵,答案是否定的。

16

是的,@synchronized指令是可重入的。請參見「線程編程指南」中的Using the @synchronized Directive以及ObjC編程語言中的Threading

也就是說,你應該幾乎從不在iOS中使用它。在大多數情況下,您可以避免各種類型的鎖,更不用說像重入式鎖那樣的重量級(緩慢)鎖。請參閱「併發編程指南」,特別是Migrating Away from Threads,以獲取iOS優於手動線程管理和鎖定的基於隊列的方法的詳細信息。

例如,讀/寫鎖的工作原理是這樣使用大中央調度:

- (id)init { 
    ... 
    _someObjectQueue = dispatch_queue_create("com.myapp.someObject", 
              DISPATCH_QUEUE_CONCURRENT); 
} 

// In iOS 5 you need to release disptach_release(_someObjectQueue) in dealloc, 
// but not in iOS 6. 

- (id)someObject { 
    __block id result; 
    dispatch_sync(self.someObjectQueue, ^{ 
    result = _someObject; 
    }); 
    return result; 
} 

- (void)setSomeObject:(id)newValue { 
    dispatch_barrier_async(self.queue, ^{ 
    _someObject = newValue; 
}); 

這種方法允許無限制的並行讀者,以獨特的作家,同時確保作家從未捱餓,並且寫入和讀取的串行化,同時避免任何內核調用,除非存在實際的爭用。這就是說它非常快速簡單。

當閱讀器出現時,您排隊請求以讀取該值並等待其處理。當一個寫者出現時,它會對一個屏障請求進行排隊以更新它,這就要求當前沒有來自該隊列的其他請求正在運行。通過這個構造,開發人員不需要管理任何鎖。只需按照您希望它們運行的​​順序將事情放在隊列中即可。

+0

'@ synchronized'可重入,但不支持多個讀卡器。 GCD將需要對我現有的代碼進行重大重組。 – Askable

+0

你是正確的@synchronized不支持多讀者。這種方法在可可中並不常見,我不熟悉pthread_rwlock_init之外的一個很好的解決方案,我記得它不是可重入的。正如我所說的,這種鎖定效率非常低,iOS和現代Mac在GCD和NSOperationQueue中具有更快,更安全和更簡單的機制。在較老的Mac中,合作(runloop)多任務是強烈的首選。 .NET繼承了Java對線程和鎖的熱愛。 ObjC不鼓勵顯式線程。 Cocoa不像.NET,值得在iOS中學習Cocoa方法。 –

+0

(是的,我知道這並不能真正回答你的問題,對不起。) –