NSOperationQueue中不需要锁?

stu*_*yro 2 multithreading objective-c nsoperationqueue ios

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

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

  2. 何时在NSOperationQueue中使用锁?

Ken*_*ses 10

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

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

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