关于互斥和死锁

时间:2013-05-26 19:22:01

标签: linux linux-kernel

我有以下代码:

pthread_mutex lock_row[M], lock_culm[M];
FUNCTION SIGNATURE (..., int i, int j, ...) {
   pthread_mutex_lock(&lock_row[i]);
   pthread_mutex_lock(&lock_culm[j]);
   ...CRITICAL CODE...
   pthread_mute_unlock(&lock_row[j]);
   pthread_mute_unlock(&lock_row[i]);
}

我可以在第一次锁定到第二次锁定之间遇到死锁吗?假设我们在第一行之后有一个上下文切换,而其他线程试图再次锁定某些东西?我真的不明白我想进一步了解这一点。

2 个答案:

答案 0 :(得分:1)

除了你尝试两次解锁时可能的拼写错误,这个例子永远不会死锁。两次锁定调用之间的上下文切换不会对此处涉及的机制构成威胁。将其视为获得更高水平的津贴。获得每个锁,允许此进程或线程执行更多操作。每个锁定都是一个门,可以保持过程直到没有其他锁定器阻止进入更高级别。无论两个锁定之间发生什么,都无关紧要,只要它不会改变这种限制水平。

答案 1 :(得分:0)

   pthread_mutex_lock(&lock_row[i]);
   pthread_mutex_lock(&lock_culm[j]);

只要所有代码按此顺序获取这些锁定 - 首先是lock_row锁定,然后是第二个lock_culm锁定,这就没问题了。如果代码的另一部分以相反的顺序采用这些相同的锁,那么它可能会死锁。

由于这个原因,通常在复杂的程序中定义锁定顺序 - 程序中所有锁的全局排序,定义它们的顺序。