互斥锁未初始化

时间:2012-02-05 16:26:35

标签: linux

有没有人知道在创建互斥锁时,必须初始化它,还是可以直接锁定它而不调用pthread_mutex_init?

我做了一个模拟死锁的示例应用程序,只是为了确保互斥锁工作并以下列方式声明了2个互斥锁(以创建死锁):

static pthread_mutex_t fastmutex1 = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t fastmutex2 = PTHREAD_MUTEX_INITIALIZER; 

死锁完美有效,因为它是用一些默认值初始化的。 另一方面,当用这个做同样的事情时:

static pthread_mutex_t fastmutex1;
static pthread_mutex_t fastmutex2;

我预计不会工作,但死锁的出现方式与上一个例子完全相同。

顺便说一下,我在Linux内核2.6.18上运行它

寻求帮助。

3 个答案:

答案 0 :(得分:3)

根据这个documentation(以及我用pthreads读过或亲自完成的所有其他事情):

  

互斥变量必须使用pthread_mutex_t类型声明,并且必须先进行初始化才能使用它们。

我怀疑其他任何事情都会触发未定义的行为。

答案 1 :(得分:3)

在我的Debian / Sid / AMD64系统上,/usr/include/pthread.h包含

 # define PTHREAD_MUTEX_INITIALIZER \
   { { 0, 0, 0, 0, 0, 0, { 0, 0 } } }

这意味着(在我的系统上)pthread_mutex_t被有价值地初始化为全零。并且静态变量被初始化(在C中)为全零,在运行时恰好相同(并解释了您已经获得的行为)。

但是,无法保证PTHREAD_MUTEX_INITIALIZER保持不变,或者在其他系统上全部为零。因此,您最好用它显式初始化静态pthread_mutex_t变量。

答案 2 :(得分:1)

PTHREAD_MUTEX_INITIALIZER通常用于静态分配的互斥锁(因此语法1是正确的方法)。 在定义的各种实现中(AIXLINUXSOLARIS),似乎会集中在您的案例中。

在所有其他情况下,您应默认尝试按

中的方式初始化互斥锁
pthread_mutex_init(&mutex,0);

会尝试将其初始化为PTHREAD_MUTEX_INITIALIZER

请记住,以后在尝试获取互斥锁时可以进行错误检查(实际上是在STL中完成);

static int e = pthread_mutex_lock(&mutex);
if( e ) { 
  throw std::string("Everything is crazy in here");
}

因为如果互斥锁尚未初始化,返回值将等于EINVAL