这确实取决于实现 – 所以既然您已经具体询问了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)。
最后
以上就是美满豆芽最近收集整理的关于linux读写锁 饥饿,linux – 如何防止在pthreads读写锁中的作者饥饿的全部内容,更多相关linux读写锁内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复