Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 关于互斥和死锁_Linux_Linux Kernel - Fatal编程技术网

Linux 关于互斥和死锁

Linux 关于互斥和死锁,linux,linux-kernel,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]); pthr

我有以下代码:

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

我能在第一个锁和第二个锁之间获得死锁吗?假设我们在第一行之后有一个上下文切换,而另一个线程再次尝试锁定某个内容?我真的不明白这一点,我想进一步理解这一点。

除了尝试两次解锁某个内容时可能出现的打字错误外,此示例永远不会死锁。两个锁调用之间的上下文切换不会对此处涉及的机制造成威胁。可以把它看作是获得更高水平的津贴。每获得一个锁,这个进程或线程就可以做更多的事情。每一个锁都是一个门,它可能会将进程保持到没有其他锁持有者阻止进入更高级别为止。两次锁定之间发生的任何事情都无关紧要,只要它不改变津贴水平

   pthread_mutex_lock(&lock_row[i]);
   pthread_mutex_lock(&lock_culm[j]);
只要您的所有代码都按此顺序使用这些锁,就可以了-首先是
lock\u行
lock,然后是
lock\u culm
lock。如果代码的另一部分以相反的顺序使用这些相同的锁,那么它可能会死锁


因此,在复杂的程序中,通常会定义锁定顺序,即程序中所有锁的全局顺序,定义它们的使用顺序。

可能的重复会导致崩溃。您将解锁行两次。并且您从未解锁
lock\u culm
数组中的互斥锁。。。但也许那只是个打字错误?