posix互斥锁没有按预期工作

时间:2012-08-11 21:11:17

标签: c linux pthreads mutex

我有一个问题。

我初始化了一个静态互斥锁,并尝试将其锁定在我的所有函数中。 我意外地忘记在其中一个函数中解锁它,但是当我调用另一个同时尝试获取互斥锁的函数时,似乎没有发生死锁。

有人可以解释一下,为什么这种方式没有发生死锁?

解释我的问题情景的代码:

 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

 void main(void)
 {
   func1();  // Mutex acquired initially but not released at end
   func2();  // This function acquires mutex even though mutex was not released by func1();

 }


 void func1(void)
 {
   pthread_mutex_lock(&mutex);

   printf("I am in func1\n");

   //MUTEX NOT UNLOCKED
 }

 void func2(void)
 {
   pthread_mutex_lock(&mutex);

   printf("I am in func2\n");

   //MUTEX AGAIN NOT UNLOCKED
 }

有人可以请问我为什么在func2()中没有发生死锁,因为fute1没有在func1()中发布?

2 个答案:

答案 0 :(得分:2)

根据规范,PTHREAD_MUTEX_INITIALIZER相当于默认的互斥锁:

  

如果默认互斥锁属性合适,则为宏   PTHREAD_MUTEX_INITIALIZER可用于初始化互斥锁   静态分配。效果相当于动态   通过使用参数attr调用pthread_mutex_init()进行初始化   指定为NULL,但不执行错误检查。

对于默认的互斥锁,尝试锁定已被调用线程锁定的互斥锁会导致未定义的行为:

  

如果互斥锁类型为PTHREAD_MUTEX_DEFAULT,则尝试递归   锁定互斥锁导致未定义的行为。

答案 1 :(得分:1)

http://linux.die.net/man/3/pthread_mutex_lock

  

如果互斥锁类型为PTHREAD_MUTEX_DEFAULT,则尝试递归   锁定互斥锁导致未定义的行为。

你的程序有undefined behavior,所以可能突然输出“格式化root分区,chomp chomp”......谁知道。