objective-c – 用NSOperationQueue解决读写器问题?

我知道有可能使用障碍解决GCD中的读者作家问题.由于我(通常)尝试在性能不是关键问题时使用NSOperationQueue而不是GCD,所以我想要一个NSOperation兼容的解决方案来解决这个问题.

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

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

解决方法

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

>创建NSBlockOperation子类ReaderWriterBlockOperation.添加到它的属性BOOL作家.
>每个受保护的资源创建一个操作队列.
>停止将您的操作队列暴露给客户端.而是暴露API -readWithBlock:和-writeWithBlock :.两个入门一个ReaderWriterBlockOperation,一个与writer == NO,另一个== YES.他们的操作管理依赖关系如下:

> -readWithBlock:在@synchronized(self)块中,执行从最后到第一个操作的扫描查找写入程序块.如果没有找到,它会添加操作并返回.如果找到它,则使新的读取器块依赖于作者,排列它并返回.
> -writeWithBlock:做同样的事情.除非在排队操作中没有找到作者,否则这将阻止所有读者找到.如果在排队操作中找到一个,则它依赖于该操作以及所有以下(读取器)操作.

这应该是阻止所有读者的结果,直到作者完成之前,阻止所有作家,直到读者完成之前.

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

所有这一切,如果系统提供了一个工作的解决方案,如障碍块,你应该使用它.这个整个系统是一个操作队列来执行调度队列已经被调整得很好的事情.如果性能实际上不是一个问题,那么为什么不使用串行队列(NSOperationQueue,最大并发操作数为== 1)?

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...