如果线程在进行pthread_mutex_lock()调用时没有成功会发生什么?

时间:2011-01-23 22:47:36

标签: c multithreading pthreads posix

我正在做一个实验,我认为这是一个有保障的死锁情况:

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);
}

如果线程无法锁定会怎样?它是否进入队列,等待互斥锁,还是只是转到下一条指令?

3 个答案:

答案 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.