2

我正在阅读 Apple 的文档并发编程指南,我认为 OperationQueue 是一系列操作。文档说我们在大多数情况下都不在 NSOperationQueue 中使用锁。

问题

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

  2. 什么时候在 NSOperationQueue 中使用锁?

4

1 回答 1

10

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

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

NSOperationQueue不提供对读写锁定的支持。您可以pthread_rwlock为此使用 API。但另一种方法是将 GCD 调度队列与屏障任务一起使用。使用 创建私有并发队列dispatch_queue_create()。使用 向它提交读取任务dispatch_[a]sync()。使用dispatch_barrier_[a]sync().

于 2012-05-23T13:32:56.993 回答