0

我有以下代码:

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]);
}

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

4

2 回答 2

1

除了尝试解锁某物两次时可能出现的拼写错误,这个例子永远不会死锁。两个锁调用之间的上下文切换对这里涉及的机制没有威胁。将其视为获得更高水平的津贴。每获得一个锁,这个进程或线程就可以做更多的事情。每个锁都是一个门,它可能会阻止进程直到没有其他锁持有者阻止更高级别的进入。两个锁定之间发生的任何事情都无关紧要,只要它不改变该允许水平即可。

于 2013-05-27T00:28:59.620 回答
0
   pthread_mutex_lock(&lock_row[i]);
   pthread_mutex_lock(&lock_culm[j]);

只要您的所有代码都按此顺序获取这些锁,这很好 -lock_row首先是锁,然后是lock_culm第二个锁。如果代码的另一部分以相反的顺序获取这些相同的锁,那么它可能会死锁。

出于这个原因,在复杂的程序中通常会定义锁定顺序——程序中所有锁的全局排序,定义它们应该被采用的顺序。

于 2013-05-27T01:10:09.090 回答