[英]Threads trying to acquire pthread_mutex_lock(&mutex) What happens if they don't get the lock?
[英]What happens if a thread doesn't succeed when making a pthread_mutex_lock() call?
我正在做一个实验,我认为这是可以保证的死锁情况:
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);
}
如果线程无法锁定怎么办? 它是否进入队列,等待互斥,还是只是继续执行下一条指令?
在您的情况下,两个线程将永远挂起,等待互斥。 如果您同时启动两个线程。
为什么不创建互斥对象和线程,然后运行示例?
如果一个线程试图锁定已被另一个线程锁定的互斥锁,它将被挂起。 在这种情况下,只有获得了锁,它的执行才会继续。 (尽管没有“队列”-只是一组无序的等待线程。 任何等待线程都可以成为下一个获取互斥锁的线程)。
如果线程试图锁定已被自身锁定或未正确初始化的互斥锁,则pthread_mutex_lock()
可能返回非零错误代码,并且执行将继续进行 ,而不会获取该互斥锁。
这取决于它无法锁定的原因。 例如,如果线程已持有锁,则可能返回错误。 无论如何,您应该检查返回值,并检查手册页中errno
中返回的错误代码。 我的(linux)指出:
The pthread_mutex_lock() function may fail if: EDEADLK The current thread already owns the mutex.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.