试图了解c中的死锁

Car*_*ero 2 c multithreading deadlock pthreads

我正在学习我的系统编程考试,但是在c中遇到一个简单的死锁示例时遇到了一些麻烦.我知道只要等待进程仍然持有第一个需要的另一个资源就会发生死锁,但是我很难用c代码理解它.有人可以提供任何简单的例子吗?

use*_*342 5

有人可以提供任何简单的例子吗?

这是一个简单的例子:一段代码可能需要获取两个锁,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保持.如所写,线程被无限期地阻塞,两者都不能继续.