我有以下代码:
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]);
}
我可以在第一次锁定到第二次锁定之间遇到死锁吗?假设我们在第一行之后有一个上下文切换,而其他线程试图再次锁定某些东西?我真的不明白我想进一步了解这一点。
答案 0 :(得分:1)
除了你尝试两次解锁时可能的拼写错误,这个例子永远不会死锁。两次锁定调用之间的上下文切换不会对此处涉及的机制构成威胁。将其视为获得更高水平的津贴。获得每个锁,允许此进程或线程执行更多操作。每个锁定都是一个门,可以保持过程直到没有其他锁定器阻止进入更高级别。无论两个锁定之间发生什么,都无关紧要,只要它不会改变这种限制水平。
答案 1 :(得分:0)
pthread_mutex_lock(&lock_row[i]);
pthread_mutex_lock(&lock_culm[j]);
只要所有代码按此顺序获取这些锁定 - 首先是lock_row
锁定,然后是第二个lock_culm
锁定,这就没问题了。如果代码的另一部分以相反的顺序采用这些相同的锁,那么它可能会死锁。
由于这个原因,通常在复杂的程序中定义锁定顺序 - 程序中所有锁的全局排序,定义它们的顺序。