快速解决死锁?

时间:2019-01-15 10:11:27

标签: c linux multithreading thread-safety

我的课本描述了死锁,如下图所示:

enter image description here

其中st是信号灯和

void P(sem_t *s); /* Wrapper function for sem_wait */
void V(sem_t *s); /* Wrapper function for sem_post */

我可以理解它是如何工作的,如果一个线程进入死锁区域,它将无法继续进行并永远卡住。教科书还介绍了互斥锁的排序规则:  如果对于程序中的每对互斥锁(s,t),同时拥有s和t的每个线程都以相同的顺序锁定它们,则该程序将无死锁。 例如,我们可以先锁定s,然后锁定t in来修复死锁。 每个线程,下面的图片显示了结果进度图: enter image description here

但是我只是快速解决了问题,不确定我是否正确:

我们只需在P和V操作之间添加一些琐碎的语句,例如单个;int test = 0,这将在两个禁止区域之间创建一个垂直间隙,因此线程最终可以通过下图显示: enter image description here

我的方法在技术上是否正确?

2 个答案:

答案 0 :(得分:0)

  

我们可以添加一些简单的语句,例如single;或P和V操作之间的int test = 0,这将在两个禁止区域之间创建一个垂直间隙,因此线程最终可以通过该间隙,如下图所示。

第一个“;” (对于编译器生成的代码,您期望有什么?)或int test = 0;不会造成间隙,即使执行或线程是异步的,您也不能对它们的执行情况有所猜想,这就是为什么您有互斥锁btw

因此,如果需要获取多个互斥锁,则必须在所有线程中以相同的顺序进行操作。显然,互斥锁并不是死锁的唯一方法,必须考虑所有同步点

答案 1 :(得分:0)

本书中的两张图片显示了重叠矩形。重叠的区域对应于以下事实:任一线程可以同时拥有两个互斥量。另一方面,您绘制的图片显示的是重叠的矩形。如果我们以与书中的图片相同的方式解释您的图片,则不重叠意味着两个线程都不能同时拥有两个互斥体。

是的,重新设计代码以使一次线程都不会锁定一个互斥体是一种防止线程在获取互斥体时死锁的有保证的方法,但是这也可能会使您的程序更难有效地执行所需的任何操作。这样就是 Giant Lock 反模式。


关于,“死锁的快速解决方案?”

死锁是一个 architectural 问题。没有针对体系结构问题的快速修复。