我们确实需要具有与 "PTHREAD_MUTEX_ROBUST" 相反的属性 "PTHREAD_MUTEX_STALLED" 的互斥量吗?

Do we indeed need mutex with attribute "PTHREAD_MUTEX_STALLED" which is opposite to "PTHREAD_MUTEX_ROBUST"?

我正在阅读 APUE 第 12 章(第 3 版),它说:我们可以将 PTHREAD_MUTEX_STALLEDPTHREAD_MUTEX_ROBUST 设置为互斥量。但我不认为我们需要属性为 PTHREAD_MUTEX_STALLED 的互斥锁,互斥锁应始终为 "robust" ,以便在锁定互斥锁的一方已死时通知我们。如果 mutex 是 "stalled",我们将永远挂起。

而且我知道 Windows' 互斥量总是 "robust" 如果锁定互斥量的一方已死,我们将收到错误通知 WAIT_ABANDONED。那么,在什么样的场景下,我们必须使用"stalled" mutex,而不是"robust" mutex?

感谢您的关注。

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

  • 如果使用健壮的互斥锁,那么每次尝试锁定互斥锁时,都必须检查 EOWNERDEAD。所以它需要额外检查。

  • 如果 pthread_mutex_lock() 返回 EOWNERDEAD 那么您可能需要检查与必须检查的互斥锁相关的共享对象的所有状态并且互斥锁状态具有通过调用 pthread_mutex_lock().

  • 恢复
  • 这是默认的互斥属性。因此,应用程序无需调用:pthread_mutexattr_setrobust().

  • 历史:早期的 pthread 实现没有强大的互斥量。

因此,仅当应用程序认为线程在持有互斥锁时可能意外终止时才需要进行上述所有额外检查,而大多数线程应用程序的设计方式并非如此。因此,如果默认行为(停滞)足够或需要强大的互斥锁,则由应用程序做出决定。