Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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_Kernel_Mutex - Fatal编程技术网

Linux 互斥锁的获取和释放顺序是什么?

Linux 互斥锁的获取和释放顺序是什么?,linux,kernel,mutex,Linux,Kernel,Mutex,我知道互斥的功能。但现在我对它的时机感到困惑。我特别指的是Linux内核代码 例如,我们有3个线程(假设它们在同一个处理器上,并且都是具有相同优先级的正常任务)。线程1、2和3尝试获取互斥量,但只有线程1获得互斥量。线程2和3被阻塞并进入睡眠状态。然后线程1完成了工作并解锁互斥锁 所以我的问题是:在这个时刻,会发生什么?线程1是否会继续执行,因为它的计划时间片没有用完?或者线程2是否会立即获取锁并开始执行,因为它是第二个想要获取锁的线程?或者线程3会立即获取锁并开始执行,因为假定它下一步从任务调

我知道互斥的功能。但现在我对它的时机感到困惑。我特别指的是Linux内核代码

例如,我们有3个线程(假设它们在同一个处理器上,并且都是具有相同优先级的正常任务)。线程1、2和3尝试获取互斥量,但只有线程1获得互斥量。线程2和3被阻塞并进入睡眠状态。然后线程1完成了工作并解锁互斥锁


所以我的问题是:在这个时刻,会发生什么?线程1是否会继续执行,因为它的计划时间片没有用完?或者线程2是否会立即获取锁并开始执行,因为它是第二个想要获取锁的线程?或者线程3会立即获取锁并开始执行,因为假定它下一步从任务调度器运行(让我们假设这一点)?会发生什么?

一旦线程1释放锁,接下来会发生什么是不确定的。您上面概述的任何场景都是可能的

如果应用程序要求线程之间有一个非常特定的顺序,那么您可能希望尝试让线程之间进行更明确的通信。在C语言中,您可以使用
管道()
实现这一点


一般来说,如果您接受混乱并让调度程序选择,性能最好。

线程1完成工作后,他会将互斥对象返回给其他线程,然后进入睡眠状态

我不太明白。那么你的意思是互斥解锁可能不会立即唤醒锁上的线程?那么谁来决定下一步应该执行哪一个呢?任务调度器?@HaoShen,没错。调度程序将决定接下来会发生什么。所以我认为线程1将继续执行,因为当它解锁互斥锁时,他的时间片还没有用完?你认为这是对的吗?@HaoShen没有任何保证。线程1可以继续,或者它可以立即挂起以支持另一个线程。不能保证线程1会立即进入睡眠状态。它可能会无限期地继续执行。@Doniy或者甚至线程1只执行了很短的时间?如果它睡着了,谁会被叫醒?基于FIFO?我想,在返回互斥锁后,线程1无法执行@doniyor如果线程1不在关键部分,则可以自由执行任何操作。现在,如果它试图在线程2获得锁之后重新获取锁,那么线程1将被阻塞。但是简单地释放锁并不会迫使线程离开处理器。@chrisaycock哦,是的,你是对的,我认为除了关键部分中的一个之外,没有什么可以执行的。。。你完全正确