默认的互斥锁属性是什么? 我特意寻找默认的健壮属性值。
答案 0 :(得分:3)
从man pthread_mutexattr_getrobust我们可以看到默认的健壮值是:
<强> PTHREAD_MUTEX_STALLED_NP 强>
如果在持有互斥锁时终止互斥锁的所有者,则不会采取任何特殊操作。如果没有其他线程可以解锁互斥锁,则可能导致死锁。 这是默认值。
这意味着默认情况下互斥锁不健壮。
展望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)。