NSOperationQueue中不需要锁?

时间:2012-05-23 12:41:14

标签: objective-c ios multithreading nsoperationqueue

我正在阅读Apple的文档Concurrent Programming Guide,我认为OperationQueue是一系列操作。该文件说我们在大多数情况下都没有在NSOperationQueue中使用锁。

问题

  1. 如何使用NSOperationQueue实现读写任务?

  2. 何时在NSOperationQueue中使用锁?

1 个答案:

答案 0 :(得分:10)

操作队列不一定是串行队列。您可以通过调用[queue setMaxConcurrentOperationCount:1]将操作队列设置为串行队列。否则,默认情况下,NSOperationQueue是并发的。

您通常应该设计您提交给队列的操作,以便它们不需要锁定。那是你的责任。这个想法是操作应该是自包含的。应该在提交运行之前配置它们需要运行的数据。该数据应该是私人副本;它不应该是操作在其他东西也在访问它的同时访问的东西。当操作正在运行时,它应该只与其私有数据一起使用,不应该访问程序的其他部分。操作完成后,应将结果提供给程序的其余部分。 (这可能是被动的,只需将其结果存储在自己的一个属性中。然后,程序中可能已经观察到操作完成的其他部分可以读取它。或者它可以是活动的,操作的最后一件事就是它调用其他一些对象并将结果发送给它。)

NSOperationQueue不支持读写锁定。您可以使用pthread_rwlock API。但另一种方法是使用带屏障任务的GCD调度队列。使用dispatch_queue_create()创建专用并发队列。使用dispatch_[a]sync()向其提交阅读任务。使用dispatch_barrier_[a]sync()向其提交写入任务。