我对pthread函数pthread_rwlock_wrlock的行为有疑问。上面链接的规范说明当一个线程锁定了写入锁并且同一个线程再次锁定它时,它会导致未定义的行为(我实际上可以观察到这一点,因为在x86 Linux上调用此函数是一个noop而在PowerPC Linux上它停止线程)。
我需要的行为是一个具有以下特征的读写锁:
使用pthread_mutex_t
,可以通过初始化标志来控制锁的递归,但pthread_rwlock_t
不能这样做。
我有什么选择?我从来没有真正在C中实现这种并发原语,我想我在这里缺少一些明显的解决方案。
答案 0 :(得分:4)
说实话,递归锁定确实有一些用途,但通常它是一个黑客。我现在似乎无法找到这篇文章,但是布滕霍夫对此有一个很好的咆哮。
回到问题。你可以保留一个特定于线程的标志,表示“我有锁”。锁定后立即设置并在解锁前取消设置。由于这是访问它的唯一线程,因此您应该是安全的。所以当你试图锁定时,你只需要检查:“嘿,这件事已经被锁定了吗?”。
作为旁注:如果线程试图锁定两次,你确定设计没问题吗?
找到the article。
但如果这就是必要的,为什么POSIX会递归 互斥?
因为敢于。