使pthread_rwlock_wrlock递归

时间:2011-08-19 17:32:59

标签: locking pthreads mutual-exclusion rwlock

我对pthread函数pthread_rwlock_wrlock的行为有疑问。上面链接的规范说明当一个线程锁定了写入锁并且同一个线程再次锁定它时,它会导致未定义的行为(我实际上可以观察到这一点,因为在x86 Linux上调用此函数是一个noop而在PowerPC Linux上它停止线程)。

我需要的行为是一个具有以下特征的读写锁:

  • 线程读取锁定成功:
    • 任何线程都没有锁定
    • 锁仅由零个或多个线程(包括调用线程)读取锁定,并且可能由调用线程读取或写入锁定
  • 写锁定成功时:
    • 该锁未被任何其他线程持有
    • 只有当前线程持有锁(用于读取或写入)

使用pthread_mutex_t,可以通过初始化标志来控制锁的递归,但pthread_rwlock_t不能这样做。

我有什么选择?我从来没有真正在C中实现这种并发原语,我想我在这里缺少一些明显的解决方案。

1 个答案:

答案 0 :(得分:4)

说实话,递归锁定确实有一些用途,但通常它是一个黑客。我现在似乎无法找到这篇文章,但是布滕霍夫对此有一个很好的咆哮。

回到问题。你可以保留一个特定于线程的标志,表示“我有锁”。锁定后立即设置并在解锁前取消设置。由于这是访问它的唯一线程,因此您应该是安全的。所以当你试图锁定时,你只需要检查:“嘿,这件事已经被锁定了吗?”。

作为旁注:如果线程试图锁定两次,你确定设计没问题吗?

修改

找到the article

  

但如果这就是必要的,为什么POSIX会递归   互斥?

     

因为敢于。