首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们真的需要带有属性"PTHREAD_MUTEX_STALLED“(与"PTHREAD_MUTEX_ROBUST”相反)的互斥对象吗?

我们真的需要带有属性"PTHREAD_MUTEX_STALLED“(与"PTHREAD_MUTEX_ROBUST”相反)的互斥对象吗?
EN

Stack Overflow用户
提问于 2015-07-04 06:38:18
回答 1查看 226关注 0票数 2

我正在阅读APUE第12章(第3版),它说:我们可以将PTHREAD_MUTEX_STALLEDPTHREAD_MUTEX_ROBUST设置为互斥体。但是我不认为我们需要属性PTHREAD_MUTEX_STALLED的互斥,互斥应该总是“健壮的”,这样如果锁定互斥的一方死了,我们就可以得到通知。如果互斥是“停滞”,我们将永远暂停。

我知道,Windows的互斥锁总是“健壮的”,如果锁定互斥锁的侧死了,我们将收到错误通知WAIT_ABANDONED。那么,在什么样的场景中,我们必须使用“停滞”互斥体,而不是“健壮”互斥体?

感谢您的关注。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-04 08:57:25

我看到了停滞的互斥体存在的以下原因:

  • 如果使用健壮互斥锁,那么每次试图锁定互斥锁时,都必须检查是否为EOWNERDEAD。所以需要额外的检查。
  • 如果EOWNERDEADpthread_mutex_lock()返回,那么您可能需要检查与该互斥对象相关的共享对象的所有状态,并且必须通过调用pthread_mutex_lock()恢复互斥对象状态。
  • 这是默认的互斥属性。因此,应用程序不需要调用:pthread_mutexattr_setrobust()
  • 历史:早期的线程实现没有健壮的互斥。

因此,只有当应用程序认为线程在保存互斥对象时可能意外死亡时,才需要进行上述所有额外的检查,而这不是大多数线程应用程序是如何设计的。因此,如果需要默认行为(停滞),或者需要健壮的互斥,这是应用程序要做出的决定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31217728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档