2012-05-23 24 views
2

我正在閱讀Apple的文檔Concurrent Programming Guide,我認爲OperationQueue是一系列操作。該文件說,我們大多數情況下不使用NSOperationQueue中的鎖。在NSOperationQueue中不需要鎖定?

問題

  1. 如何實現與NSOperationQueue讀&寫任務?

  2. 何時在NSOperationQueue中使用鎖定?

回答

10

操作隊列不一定是串行隊列。您可以通過調用[queue setMaxConcurrentOperationCount:1]來將操作隊列設置爲一個串行隊列。否則,默認情況下,NSOperationQueue是併發的。

您通常應該設計您提交給隊列的操作,以便它們不需要鎖定。這是你的責任。這個想法是操作應該是獨立的。他們應該在提交運行之前配置他們需要操作的數據。該數據應該是私人副本;它不應該是操作正在訪問的東西,同時其他的東西也在訪問它。在操作運行時,它只能使用其私有數據,不應該訪問程序的其他部分。操作完成後,應該將結果提供給程序的其餘部分。 (這可能是被動的,只需將其結果存儲在自己的屬性中即可,然後程序中可能觀察到操作完成的其他部分可以讀取它,或者它可以是活動的,操作最後一個操作調用其他對象並將其結果發送給它)。

NSOperationQueue不提供對讀寫鎖定的支持。您可以使用pthread_rwlock API。但另一種方式是使用帶有屏障任務的GCD調度隊列。使用dispatch_queue_create()創建專用併發隊列。用dispatch_[a]sync()提交閱讀任務。使用dispatch_barrier_[a]sync()向其提交寫入任務。

+1

+1很好的答案,尤其是最後一段。 –

+0

非常感謝,我還有一個問題。假設我有許多讀寫操作。我可以將它們全部添加到一個OperationQueue和[queue setMaxConcurrentOperationCount:1]? – studyro

+0

如果您將所有操作提交給串行隊列(最大併發計數爲1的隊列),則將它們串行化。一次不會有兩個人在跑,所以不用擔心他們會互相干擾。這是安全的,但可能不是最佳的效率(因爲讀者之間沒有併發性,這可能是安全的,取決於)。 –