什么是默认的互斥量属性? 我专门寻找默认稳健属性的值。
最佳答案
简答
来自 man pthread_mutexattr_getrobust我们可以看到默认的健壮值是:
PTHREAD_MUTEX_STALLED_NP
No special actions are taken if the owner of the mutex is terminated while holding the mutex lock. This can lead to deadlocks if no other thread can unlock the mutex. This is the default value.
这意味着互斥锁在默认情况下不稳健。
长话短说(在pthread代码中是如何完成的)
调查glibc sources, "nptl/" directory ,我们可以看到接下来的内容。
调用时将使用默认属性:
pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *mutexattr)
使用 mutexattr = NULL
。
在这种情况下,将使用 &default_attr
结构:
int __pthread_mutex_init (mutex, mutexattr)
{
imutexattr = (const struct pthread_mutexattr *)mutexattr ? :
&default_attr;
这是:
static const struct pthread_mutexattr default_attr =
{
/* Default is a normal mutex, not shared between processes. */
.mutexkind = PTHREAD_MUTEX_NORMAL
};
pthread_mutexattr_init()
也是如此:
((struct pthread_mutexattr *) attr)->mutexkind = PTHREAD_MUTEX_NORMAL;
PTHREAD_MUTEX_NORMAL
是:
PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
并且 PTHREAD_MUTEX_TIMED_NP
为 0(因为它是枚举中的第一个元素)。
所以默认情况下所有互斥属性都是 0(因为它们基本上只是 pthread_mutexattr
结构的 .mutexkind
字段中的位)。
Robust 是 .mutexkind
字段中的第 30 位:
#define PTHREAD_MUTEXATTR_FLAG_ROBUST 0x40000000
鲁棒性是这样计算的:
*robustness = ((iattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_ROBUST) != 0
? PTHREAD_MUTEX_ROBUST_NP : PTHREAD_MUTEX_STALLED_NP);
所以默认健壮性是PTHREAD_MUTEX_STALLED_NP
(因为mutexkind
默认为0)。
关于c - 互斥量的默认属性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28833707/