试图理解 c 中的死锁
Trying to understand deadlocks in c
我正在为我的系统编程考试而学习,但是我在用 c 编写一个简单的死锁示例时遇到了一些困难。我知道只要等待进程仍然持有第一个需要的另一个资源就会发生死锁,但是我很难用 c 代码来理解它。有人可以提供任何简单的例子吗?
Are there any simple examples someone can provide?
这里有一个简单的例子:一段代码可能需要获取两个锁,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);
同时,另一段代码可以有相同的需求,只是以相反的顺序获取锁:
pthread_mutex_lock(&b);
pthread_mutex_lock(&a);
// ... process data protected by A and B
pthread_mutex_unlock(&a);
pthread_mutex_unlock(&b);
单独来看,这两种方法都可以正常工作。但是当两段代码并发执行时,会出现以下情况:
// 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);
最后一行构成死锁:线程1阻塞等待线程2持有的锁B,线程2阻塞等待锁A,线程2持有由线程 1 编写。如所写,线程被无限期阻塞,并且都无法继续。
我正在为我的系统编程考试而学习,但是我在用 c 编写一个简单的死锁示例时遇到了一些困难。我知道只要等待进程仍然持有第一个需要的另一个资源就会发生死锁,但是我很难用 c 代码来理解它。有人可以提供任何简单的例子吗?
Are there any simple examples someone can provide?
这里有一个简单的例子:一段代码可能需要获取两个锁,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);
同时,另一段代码可以有相同的需求,只是以相反的顺序获取锁:
pthread_mutex_lock(&b);
pthread_mutex_lock(&a);
// ... process data protected by A and B
pthread_mutex_unlock(&a);
pthread_mutex_unlock(&b);
单独来看,这两种方法都可以正常工作。但是当两段代码并发执行时,会出现以下情况:
// 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);
最后一行构成死锁:线程1阻塞等待线程2持有的锁B,线程2阻塞等待锁A,线程2持有由线程 1 编写。如所写,线程被无限期阻塞,并且都无法继续。