1

我有个问题。

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

有人可以解释一下为什么不会发生死锁吗?

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

 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() 中没有发生死锁,因为在 func1() 中没有释放互斥锁?

4

2 回答 2

2

根据规范, PTHREAD_MUTEX_INITIALIZER 等效于默认互斥锁:

在默认互斥体属性合适的情况下,宏 PTHREAD_MUTEX_INITIALIZER 可用于初始化静态分配的互斥体。该效果等同于通过调用 pthread_mutex_init() 进行动态初始化,参数 attr 指定为 NULL,但不执行错误检查。

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

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

于 2012-08-11T21:21:09.617 回答
1

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

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

您的程序有未定义的行为,因此可能会突然输出“格式化根分区,chomp chomp”......谁知道呢。

于 2012-08-11T21:21:34.680 回答