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

标签 c pthreads 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 字段中的位)。

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/

相关文章:

c - Linux 中对 pthread_create 的 undefined reference

c - 信号量无破坏/取消竞争条件

c - 当按值传递静态变量时会导致 c 中的竞争条件

c++ - Reader/Writer : multiple heavy readers, 每天只写 1 次

c - "Train crossing mutex problem"- 最后两行为 NULL

c - Linux gcc <time.h> 和线程在一起

c - 为什么强制转换在 C 中给出右值?

c++ - 从/dev/sd* 元素获取/dev/disk/by-id 元素

c - 将可变长度字符串映射到 int

linux - pthread_setaffinity_np : Invalid argument?