linux读写锁 饥饿,linux – 如何防止在pthreads读写锁中的作者饥饿

这确实取决于实现 – 所以既然您已经具体询问了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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值