我刚读过this post,其解决方案似乎令人信服:
我感兴趣的是,是否有可能推进此方案以实现并发调度队列的重入锁定机制(每次读取都是使用dispatch_sync完成的,写入是使用dispatch_barrier_async完成的,如描述的那样here, see "One Resource, Multiple Readers, and a Single Writer")。
P.S。我想我已经设法使用[NSThread currentThread].threadDictionary
here来实现这一点,但我不喜欢处理[NSThread currentThread]
因为我依赖GCD。是否可以使用某些棘手的[NSThread currentThread].threadDictionary
代码替换dispatch_set_specific/dispatch_get_specific
的使用情况?
答案 0 :(得分:9)
如果我对这个问题发表评论,你在评论链接帖子时问过我。对不起,我花了很长时间,但我记得第一次看到它时,我觉得我没有任何富有成效的说法。但是今天我被提醒了这个话题并回过头来看这个问题,并且想到我会拍摄一下:
总的来说,我建议不要走这条路。正如我在the linked-to/from answer中所解释的那样,使用dispatch_get/set_specific
实现递归“锁定”是从不防弹,超越简单的串行案例到单作者/多读者dispatch_barrier_[a]sync
的语义不会消除这些问题,并可能引入更多问题。
顺便说一句,如果您只是寻找替代[NSThread threadDictionary]
的线程本地存储,可能是非Objective-C API的形式,那么您应该使用pthread_setspecific
和pthread_getspecific
。这些是较低级别的POSIX调用[NSThread threadDictionary]
(几乎可以肯定)构建的。
对我有用的一般建议是,“使用最高级别的抽象来完成工作。”在这个问题的上下文中,这将转化为(暂时搁置上述对递归锁定的批评):如果你在Objective-C中工作,并且无论出于何种原因,你想要递归锁定,只需使用{{1 }}。当性能分析告诉您使用@synchronized
实际上导致问题时,然后会寻找更好的解决方案(有先见之明,知道“更好的解决方案”可能需要离开所有的递归锁定。)
总而言之,尝试调整GCD的并发队列屏障行为来模拟递归读取器/写入器锁定感觉就像一个失败的命题。充其量,它总是受限于我为串行案例解释over here的限制。在最坏的情况下,你会发布一种最终会降低并发性的模式。