互斥量的默认属性是什么?

What are the default attributes of a mutex?

默认的互斥体属性是什么? 我专门寻找默认健壮属性的值。

简答

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 字段中的位)。

稳健的是 .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)。