我正在做一个实验,我认为这是一个有保障的死锁情况:
void *thread_1(void *vptr)
{
pthread_mutex_lock(&a);
sleep(1);
pthread_mutex_lock(&b);
pthread_mutex_unlock(&b);
pthread_mutex_unlock(&a);
}
void *thread_2(void *vptr)
{
pthread_mutex_lock(&b);
sleep(1);
pthread_mutex_lock(&a);
pthread_mutex_unlock(&a);
pthread_mutex_unlock(&b);
}
如果线程无法锁定会怎样?它是否进入队列,等待互斥锁,还是只是转到下一条指令?
答案 0 :(得分:1)
在你的情况下,两个线程将永久挂起,等待互斥锁。如果你一次启动两个线程。
为什么不直接创建互斥锁和线程然后运行示例?
答案 1 :(得分:1)
如果某个线程试图锁定已被另一个线程锁定的互斥锁,它将被挂起。在这种情况下,它的执行将不会继续,直到它获得锁定。 (虽然没有“队列” - 只是一组无序的等待线程。任何等待线程可能是下一个获取互斥锁的线程。)
如果某个线程试图锁定已被本身锁定的互斥锁或未正确初始化,则pthread_mutex_lock()
可能会返回非零错误代码,执行将继续没有获取互斥锁。
答案 2 :(得分:0)
这取决于它无法锁定的原因。例如,如果线程已经持有锁,则可能会返回错误。
无论如何,您应该检查返回值,并查看手册页以获取在errno
中返回的错误代码。我的(linux)声明:
The pthread_mutex_lock() function may fail if: EDEADLK The current thread already owns the mutex.