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

时间:2015-03-03 14:00:15

标签: c pthreads mutex

默认的互斥锁属性是什么? 我特意寻找默认的健壮属性值。

1 个答案:

答案 0 :(得分:3)

简短回答

man pthread_mutexattr_getrobust我们可以看到默认的健壮值是:

  

<强> PTHREAD_MUTEX_STALLED_NP

     

如果在持有互斥锁时终止互斥锁的所有者,则不会采取任何特殊操作。如果没有其他线程可以解锁互斥锁,则可能导致死锁。   这是默认值。

这意味着默认情况下互斥锁不健壮

长篇故事(如何在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(因为它们基本上只是.mutexkind结构的pthread_mutexattr字段中的位。)

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