我正在阅读APUE第12章(第3版),它说:我们可以将PTHREAD_MUTEX_STALLED或PTHREAD_MUTEX_ROBUST设置为互斥体。但是我不认为我们需要属性PTHREAD_MUTEX_STALLED的互斥,互斥应该总是“健壮的”,这样如果锁定互斥的一方死了,我们就可以得到通知。如果互斥是“停滞”,我们将永远暂停。
我知道,Windows的互斥锁总是“健壮的”,如果锁定互斥锁的侧死了,我们将收到错误通知WAIT_ABANDONED。那么,在什么样的场景中,我们必须使用“停滞”互斥体,而不是“健壮”互斥体?
感谢您的关注。
发布于 2015-07-04 08:57:25
我看到了停滞的互斥体存在的以下原因:
EOWNERDEAD。所以需要额外的检查。EOWNERDEAD由pthread_mutex_lock()返回,那么您可能需要检查与该互斥对象相关的共享对象的所有状态,并且必须通过调用pthread_mutex_lock()恢复互斥对象状态。pthread_mutexattr_setrobust()。因此,只有当应用程序认为线程在保存互斥对象时可能意外死亡时,才需要进行上述所有额外的检查,而这不是大多数线程应用程序是如何设计的。因此,如果需要默认行为(停滞),或者需要健壮的互斥,这是应用程序要做出的决定。
https://stackoverflow.com/questions/31217728
复制相似问题