2012-05-23 18 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的队列),则将它们串行化。一次不会有两个人在跑,所以不用担心他们会互相干扰。这是安全的,但可能不是最佳的效率(因为读者之间没有并发性,这可能是安全的,取决于)。 –