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

时间:2015-07-04 06:38:19

标签: c linux multithreading synchronization mutex

我正在阅读APUE第12章(第3版),它说:我们可以将PTHREAD_MUTEX_STALLEDPTHREAD_MUTEX_ROBUST设置为互斥锁。但我认为我们不需要具有属性PTHREAD_MUTEX_STALLED的互斥锁,互斥锁应始终具有强大的" ,以便在锁定互斥锁的一方死亡时通知我们。如果互斥锁停止运行,我们将永久停用。

我知道Windows'互斥体永远是强大的#34;如果锁定互斥锁的一方已经死亡,我们将收到错误WAIT_ABANDONED的通知。所以,在什么样的情况下,我们必须使用"停滞"互斥,不是"健壮"互斥?

感谢您的关注。

1 个答案:

答案 0 :(得分:1)

我看到为什么存在停滞的互斥锁的原因如下:

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

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

  • 它是默认的互斥锁属性。因此,不需要应用程序调用:pthread_mutexattr_setrobust()

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

因此,只有当应用程序认为线程在持有互斥锁时可能意外死亡时才需要上述所有附加检查,这不是大多数线程应用程序的设计方式。因此,如果默认行为(停滞)足够或需要强大的互斥锁,那么应用程序就会做出决定。