我有一个问题。
我初始化了一个静态互斥锁,并尝试将其锁定在我的所有函数中。 我意外地忘记在其中一个函数中解锁它,但是当我调用另一个同时尝试获取互斥锁的函数时,似乎没有发生死锁。
有人可以解释一下,为什么这种方式没有发生死锁?
解释我的问题情景的代码:
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()中发布?
答案 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”......谁知道。