C 我们真的需要属性为“的互斥体吗?”;PTHREAD“u MUTEX”u STALLED“;与“相对的”是什么;PTHREAD“u MUTEX”u ROBUST;?
我正在阅读APUE第12章(第3版),它说:我们可以将C 我们真的需要属性为“的互斥体吗?”;PTHREAD“u MUTEX”u STALLED“;与“相对的”是什么;PTHREAD“u MUTEX”u ROBUST;?,c,linux,multithreading,synchronization,mutex,C,Linux,Multithreading,Synchronization,Mutex,我正在阅读APUE第12章(第3版),它说:我们可以将PTHREAD\u MUTEX\u STALLED或PTHREAD\u MUTEX\u ROBUST设置为互斥。但是我认为我们不需要属性为PTHREAD\u mutex\u STALLED的互斥体,互斥体应该总是“健壮的”,这样我们就可以在锁定互斥体的一方死机时收到通知。如果互斥被“暂停”,我们将永远暂停 我知道Windows的互斥锁始终是“健壮的”,如果锁定互斥锁的一方死机,我们将收到错误通知。那么,在什么样的场景中,我们必须使用“暂停”互
PTHREAD\u MUTEX\u STALLED
或PTHREAD\u MUTEX\u ROBUST
设置为互斥。但是我认为我们不需要属性为PTHREAD\u mutex\u STALLED
的互斥体,互斥体应该总是“健壮的”,这样我们就可以在锁定互斥体的一方死机时收到通知。如果互斥被“暂停”,我们将永远暂停
我知道Windows的互斥锁始终是“健壮的”,如果锁定互斥锁的一方死机,我们将收到错误通知。那么,在什么样的场景中,我们必须使用“暂停”互斥,而不是“健壮”互斥
感谢您的关注。我看到了暂停互斥存在的以下原因:
- 如果使用健壮的互斥体,那么每次尝试锁定互斥体时,都必须检查
。所以它需要额外的检查EOWNERDEAD
- 如果
返回pthread\u mutex\u lock()
,则可能需要检查与该互斥体相关的共享对象的所有状态,并且必须通过调用eownerded
来恢复互斥体状态pthread\u mutex\u lock()
- 这是默认的互斥体属性。因此,应用程序无需调用:
pthread\u mutexattr\u setrobust()
- 历史:早期的pthread实现没有健壮的互斥锁
因此,只有当应用程序认为线程可能在持有互斥锁时意外死亡时,才需要进行上述所有附加检查,而大多数线程应用程序都不是这样设计的。因此,如果默认行为(暂停)足够或需要健壮的互斥,则应由应用程序决定。如前所述,您的问题不清楚,除非您澄清您的问题,否则可能会被关闭。我希望我的编辑没有修改预期的问题。如果是,请回复。谢谢。但是在我的CentOS6.3 x64上,“健壮”不是默认属性。我是这么说的:stalled是默认属性。对不起,我误解了。