我一直在Mac上尝试使用rwlock,我正在经历一些似乎不应该发生的事情。使用读/写锁和死锁的递归读锁有一些奇怪的组合,但不应该。
我在pastebin上发布了代码,因为它不仅仅是一个片段。编写这段代码的方式不应该是死锁,而且在linux上运行时确实不会死锁。为什么这个死锁在mac上?
有什么想法吗?
答案 0 :(得分:1)
查看我用apple报告的错误。
https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/7/wo/0blX77DJS8lBTTxVnTsNDM/5.83.28.0.13
答案 1 :(得分:1)
这是开放的雷达错误。
答案 2 :(得分:0)
@interface ReadWriteLock : NSObject {
pthread_key_t readKey;
pthread_key_t writeKey;
pthread_rwlock_t rwLock;
}
-(void)lockRead;
-(void)unlockRead;
-(void)lockWrite;
-(void)unlockWrite;
@end
然后在调用lockRead时使用pthread_setspecific
递增readKey,在调用unlockRead时递减readKey,当密钥从0转到1时递减rd_lock
,当密钥转到时只递归rw_unlock
从1到0.将其复制到writeLock逻辑。
由于pthread_setspecific
和pthread_getspecific
是线程本地的,因此您无需锁定对这些内容的访问权限。确保在init
中调用相应的pthread创建/初始化函数,并确保在dealloc
中处置所有pthread_ *成员。
不幸的是,我不能给你完整的解决方案来源,但上面的方法有效(我已经对它进行了大量的测试)。