这确实取决于实现 – 所以既然您已经具体询问了Linux,我的意见是指现有glibc中使用的pthread的当前NPTL实现。
这里有两个相关但单独的问题。首先,有这样的情况:
目前有读锁,而作家等等。一个新线程尝试读取锁定。
这里的默认操作是允许读者继续 – 有效地“跳过队列”超过作者。但是,您可以覆盖此。如果您使用pthread_rwlockattr_setkind_np()函数在传递给pthread_rwlock_init()的attr上设置PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP标志,那么您的rwlock会在上述情况下阻止读者。
第二种情况是:
>最后一个持有人释放锁,读者和作家都在等待。
在这种情况下,NPTL将永远唤醒作家,而不是读者。
总而言之,上述意味着如果您使用PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP标志,您的作家不应该饿死(当然,现在连续的作家流可能会使读者饿死,C’est la vie)。您可以通过检查pthread_rwlock_rdlock.c和pthread_rwlock_unlock.c中的来源(全部非常可读)来确认所有这些。
请注意,还有一个PTHREAD_RWLOCK_PREFER_WRITER_NP,但它似乎没有正确的效果 – 很可能是一个错误(或者可能没有 – 见comment by jilles below)。