我正在閱讀Apple的文檔Concurrent Programming Guide,我認爲OperationQueue是一系列操作。該文件說,我們大多數情況下不使用NSOperationQueue中的鎖。在NSOperationQueue中不需要鎖定?
問題
如何實現與NSOperationQueue讀&寫任務?
何時在NSOperationQueue中使用鎖定?
我正在閱讀Apple的文檔Concurrent Programming Guide,我認爲OperationQueue是一系列操作。該文件說,我們大多數情況下不使用NSOperationQueue中的鎖。在NSOperationQueue中不需要鎖定?
問題
如何實現與NSOperationQueue讀&寫任務?
何時在NSOperationQueue中使用鎖定?
操作隊列不一定是串行隊列。您可以通過調用[queue setMaxConcurrentOperationCount:1]
來將操作隊列設置爲一個串行隊列。否則,默認情況下,NSOperationQueue
是併發的。
您通常應該設計您提交給隊列的操作,以便它們不需要鎖定。這是你的責任。這個想法是操作應該是獨立的。他們應該在提交運行之前配置他們需要操作的數據。該數據應該是私人副本;它不應該是操作正在訪問的東西,同時其他的東西也在訪問它。在操作運行時,它只能使用其私有數據,不應該訪問程序的其他部分。操作完成後,應該將結果提供給程序的其餘部分。 (這可能是被動的,只需將其結果存儲在自己的屬性中即可,然後程序中可能觀察到操作完成的其他部分可以讀取它,或者它可以是活動的,操作最後一個操作調用其他對象並將其結果發送給它)。
NSOperationQueue
不提供對讀寫鎖定的支持。您可以使用pthread_rwlock
API。但另一種方式是使用帶有屏障任務的GCD調度隊列。使用dispatch_queue_create()
創建專用併發隊列。用dispatch_[a]sync()
提交閱讀任務。使用dispatch_barrier_[a]sync()
向其提交寫入任務。
+1很好的答案,尤其是最後一段。 –
非常感謝,我還有一個問題。假設我有許多讀寫操作。我可以將它們全部添加到一個OperationQueue和[queue setMaxConcurrentOperationCount:1]? – studyro
如果您將所有操作提交給串行隊列(最大併發計數爲1的隊列),則將它們串行化。一次不會有兩個人在跑,所以不用擔心他們會互相干擾。這是安全的,但可能不是最佳的效率(因爲讀者之間沒有併發性,這可能是安全的,取決於)。 –