gpt4 book ai didi

c++ - 将两个或多个互斥量应用于一段代码

转载 作者:行者123 更新时间:2023-11-30 03:55:49 25 4
gpt4 key购买 nike

我正在研究来自 http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html 的 c++ pthreads 中的互斥锁和死锁

我理解他们,但我在一个点上堆叠。我不明白下面代码的问题是什么。你能用简单明了的话解释一下吗?我从这个网站引用:

互斥锁死锁:...将两个或多个互斥锁应用于一段代码时要小心。如果第一个 pthread_mutex_lock 被应用并且第二个 pthread_mutex_lock 由于另一个线程应用互斥锁而失败,则第一个互斥锁最终可能会锁定所有其他线程访问数据,包括持有第二个互斥锁的线程。线程可能会无限期地等待资源空闲,从而导致死锁。最好进行测试,如果发生故障,请释放资源并在重试前暂停。

01  ...
02 pthread_mutex_lock(&mutex_1);
03 while ( pthread_mutex_trylock(&mutex_2) ) /* Test if already locked */
04 {
05 pthread_mutex_unlock(&mutex_1); /* Free resource to avoid deadlock */
06 ...
07 /* stall here */
08 ...
09 pthread_mutex_lock(&mutex_1);
10 }
11 count++;
12 pthread_mutex_unlock(&mutex_1);
13 pthread_mutex_unlock(&mutex_2);
14 ...

提前致谢。

最佳答案

本质上,如果您需要两个互斥锁来执行任务,mutex_1mutex_2,如果 thread_A 获取 mutex_1thread_B 获取 mutex_2,它们陷入了死锁,因为它们都在等待另一个互斥量可用,但它们永远不会,因为另一个也在等待。

这就是为什么您通常强制执行可以获取互斥锁的命令。例如,您必须在尝试获取 mutex_2 之前获取 mutex_1。这样一来,如果不首先拥有 mutex_1,就不可能拥有 mutex_2,因此没有机会导致死锁。

     Thread_A                Thread_B
| |
| |
lock(mutex_1) | // Thread_A got mutex_1
| |
| lock(mutex_2) // Thread_B got mutex_2
| |
| |
trylock(mutex_2) | // Thread_A wants mutex_2
| trylock(mutex_1) // Thread_B wants mutex_1
| |

由于时间原因,这些线程现在处于死锁状态。两者都在等待他们永远不会得到的互斥量,因为另一个线程在完成其工作之前不会解锁它持有的互斥量。

在您的代码示例中,请注意它们做的第一件事是锁定 mutex_1。然后他们在 mutex_2 上旋转直到它可用。这是执行 mutex_1 然后是 mutex_2 的顺序。

关于c++ - 将两个或多个互斥量应用于一段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28861465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com