有没有人知道在创建互斥锁时,必须初始化它,还是可以直接锁定它而不调用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上运行它
寻求帮助。
答案 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是正确的方法)。
在定义的各种实现中(AIX,LINUX,SOLARIS),似乎会集中在您的案例中。
在所有其他情况下,您应默认尝试按
中的方式初始化互斥锁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
。