概述
这确实取决于实现 – 所以既然您已经具体询问了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读写锁 饥饿,linux – 如何防止在pthreads读写锁中的作者饥饿所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复