Objective c 使用NSOperationQueue解决读写器问题?

Objective c 使用NSOperationQueue解决读写器问题?,objective-c,concurrency,grand-central-dispatch,nsoperation,nsoperationqueue,Objective C,Concurrency,Grand Central Dispatch,Nsoperation,Nsoperationqueue,我知道在GCD中使用屏障可以解决读者-作者问题。由于在性能不是关键问题时,我(通常)尝试使用NSOperationQueue而不是GCD,因此我想要一个与NSOperation兼容的解决方案来解决此问题 我试着写我自己的,但我的解决方案变得笨拙…肯定有人已经解决了这个问题 有人知道读写器问题的NSOperation兼容解决方案吗?与大多数NSOperationQueue黑客一样,您可以利用其对操作之间依赖关系的支持: 创建一个NSBlockOperation子类,ReaderWriterBlo

我知道在GCD中使用屏障可以解决读者-作者问题。由于在性能不是关键问题时,我(通常)尝试使用
NSOperationQueue
而不是GCD,因此我想要一个与
NSOperation
兼容的解决方案来解决此问题

我试着写我自己的,但我的解决方案变得笨拙…肯定有人已经解决了这个问题


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

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

  • 创建一个
    NSBlockOperation
    子类,
    ReaderWriterBlockOperation
    。添加到it属性
    BOOL writer
  • 为每个受保护的资源创建操作队列
  • 停止向客户端公开操作队列。而是公开API
    -readWithBlock:
    -writeWithBlock:
    。两者都将
    readerwriterblock操作
    排入队列,一个是
    writer==NO
    ,另一个是
    ==YES
    。它们的操作管理依赖项,如下所示:
    • -readWithBlock:
      @synchronized(self)
      块中,从最后一个到第一个查找写入程序块的操作扫描。如果找不到,则添加操作并返回。如果找到一个,它会使新的读卡器块依赖于写入程序,使其排队,然后返回
    • -writeWithBlock:
      执行相同的操作。除非在排队操作中找不到写入程序,否则会使块依赖于找到的所有读卡器。如果在排队的操作中找到一个,它将使自己依赖于该操作和所有后续(读取器)操作
这样做的结果应该是阻止所有读卡器,直到前面的写卡器完成,并且阻止所有写卡器,直到前面的读卡器完成

一个可能的问题是:如果
NSBlockOperation
实际上在声明自身完成之前等待其块完成运行,我不清楚(因为文档不清楚,我还没有实现这一点)。如果没有,您需要在operation子类中自己管理它


综上所述,如果系统提供了一个有效的解决方案,比如障碍块,那么您应该使用它。整个系统是一个黑客,让一个操作队列做一些调度队列已经调整好处理得很好的事情。如果性能实际上不是一个问题,那么为什么不使用串行队列(
NSOperationQueue
,最大并发操作计数=1)?

这是一个很好的问题。对一些解决方案感兴趣…信号量有什么问题吗?在操作队列的底层队列调度队列上使用GCD屏障是作弊吗?