Pthread RWLock在MAC死锁上但不在Linux上?

时间:2010-10-23 08:00:01

标签: macos pthreads

我一直在Mac上尝试使用rwlock,我正在经历一些似乎不应该发生的事情。使用读/写锁和死锁的递归读锁有一些奇怪的组合,但不应该。

我在pastebin上发布了代码,因为它不仅仅是一个片段。编写这段代码的方式不应该是死锁,而且在linux上运行时确实不会死锁。为什么这个死锁在mac上?

http://pastebin.com/Ui9iS1ke

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

这是开放的雷达错误。

http://openradar.appspot.com/8588290

答案 2 :(得分:0)

亚伦:我刚碰到这个。我发现可以通过使用线程本地存储来解决这个问题。在rwlock周围创建一个包装器,增加一个线程本地密钥:

@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_setspecificpthread_getspecific是线程本地的,因此您无需锁定对这些内容的访问权限。确保在init中调用相应的pthread创建/初始化函数,并确保在dealloc中处置所有pthread_ *成员。

不幸的是,我不能给你完整的解决方案来源,但上面的方法有效(我已经对它进行了大量的测试)。