7

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

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

  • 在以下情况下,线程的读锁定成功:
    • 锁没有被任何线程持有
    • 该锁仅被零个或多个线程(包括调用线程)读锁定,并且可能被调用线程读或写锁定
  • 写锁定在以下情况下成功:
    • 锁不被任何其他线程持有
    • 只有当前线程持有锁(用于读取或写入)

使用 a pthread_mutex_t,可以通过初始化标志来控制锁的递归性,但这对于 是不可能的pthread_rwlock_t

我有哪些选择?我实际上从来没有在 C 中实现这种并发原语,我认为我在这里缺少一些明显的解决方案。

4

1 回答 1

7

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

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

作为旁注:如果一个线程尝试锁定两次,你确定设计是好的吗?

编辑

找到了这篇文章

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

因为一个敢。

于 2011-08-19T17:45:03.970 回答