有人可以提供任何简单的例子吗?
这是一个简单的例子:一段代码可能需要获取两个锁,A和B,例如,它可以原子地修改两个数据,一个受A保护,另一个受B保护.例如:
pthread_mutex_t a, b;
pthread_mutex_lock(&a);
pthread_mutex_lock(&b);
// ... process data protected by A and B
pthread_mutex_unlock(&b);
pthread_mutex_unlock(&a);
Run Code Online (Sandbox Code Playgroud)
同时,另一段代码可以具有相同的要求,但只是以相反的顺序获取锁:
pthread_mutex_lock(&b);
pthread_mutex_lock(&a);
// ... process data protected by A and B
pthread_mutex_unlock(&a);
pthread_mutex_unlock(&b);
Run Code Online (Sandbox Code Playgroud)
孤立地说,任何一种方法都可行.但是当两个代码并发执行时,可能会发生以下情况:
// neither lock is held
// thread 1 // thread 2
pthread_mutex_lock(&a); pthread_mutex_lock(&b);
// thread 1 now holds A // thread 2 now holds B
// thread 1 is waiting for B // thread 2 is waiting for A
pthread_mutex_lock(&b); pthread_mutex_lock(&a);
Run Code Online (Sandbox Code Playgroud)
最后一行构成死锁:线程1被阻塞等待锁B,由线程2保持.线程2被阻塞等待锁A,由线程1保持.如所写,线程被无限期地阻塞,两者都不能继续.