用NSOperationQueue解决读者 - 作家问题?

时间:2014-05-09 00:49:49

标签: objective-c concurrency grand-central-dispatch nsoperation nsoperationqueue

我知道可以使用障碍解决GCD中的读写器问题。由于我(通常)在性能不是关键问题时尝试使用NSOperationQueue而不是GCD,因此我希望NSOperation兼容此问题的解决方案。

我已经尝试过写自己的,但我的解决方案变得笨拙......当然有人已经解决了这个问题吗?

是否有人知道NSOperation - 兼容读写器问题的解决方案?

1 个答案:

答案 0 :(得分:1)

与大多数NSOperationQueue hackery一样,您可以利用其对操作之间依赖关系的支持:

  • 创建NSBlockOperation子类ReaderWriterBlockOperation。添加属性BOOL writer
  • 为每个受保护资源创建一个操作队列。
  • 停止向客户端公开您的操作队列。而是公开API -readWithBlock:-writeWithBlock:。两者都会ReaderWriterBlockOperationwriter == NO== YES。他们的操作管理依赖关系如下:
    • -readWithBlock:@synchronized(self)块中执行从上一次到第一次查找写入程序块的操作的扫描。如果没有找到,则添加操作并返回。如果找到一个,它会使新的阅读器块依赖于编写器,将其排队并返回。
    • -writeWithBlock:做同样的事情。除非在排队操作中找不到编写器,否则它将使该块依赖于找到的所有读取器。如果在排队操作中找到一个,它将使自己依赖于该操作和所有后​​续(读取器)操作。

这应该会阻止所有读者,直到他们面前的作者完成,并阻止所有作者直到他们完成之前的读者。

一个可能的问题:我不清楚(因为文档不清楚,我还没有这样做)如果NSBlockOperation实际等待其块完成运行,然后才宣告自己完成。如果没有,您需要在您的操作子类中自行管理。

所有这一切,如果系统提供工作解决方案,如障碍块,你应该使用它。整个系统是一个黑客,可以让一个操作队列做一些调度队列调整好处理的东西。如果性能实际上不是问题,那么为什么不使用串行队列(NSOperationQueue最大并发操作次数== 1)?