gpt4 book ai didi

c++ - 如何在 C++11 中防止线程饥饿

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:47 28 4
gpt4 key购买 nike

我只是想知道 C++11 中是否有任何锁定策略可以防止线程饥饿。

我有一堆线程在争夺一个互斥量。现在,我的问题是离开关键部分的线程立即开始竞争同一个互斥锁,并且大多数时候获胜。因此,等待互斥量的其他线程正在挨饿。

我不想让离开关键部分的线程休眠一些最短的时间,让其他线程有机会锁定互斥量。

我认为一定有一些参数可以为等待互斥锁的线程启用公平锁定,但我找不到任何合适的解决方案。

好吧,我找到了 std::this_thread::yield() 函数,它假设重新安排线程执行的顺序,但它只是对调度程序线程的提示,并且是否重新安排线程取决于调度程序线程的实现。

有什么方法可以为 C++11 中等待同一互斥锁的线程提供公平的锁定策略吗?通常的策略是什么?

谢谢

最佳答案

这是互斥锁中的一个常见优化,旨在避免在同一线程可以再次获取互斥锁时浪费时间切换任务。如果当前线程在其时间片中仍有剩余时间,那么通过让它获取互斥量而不是挂起它并切换到另一个线程(这可能会导致高速缓存行的大量重新加载和各种其他延迟)。

如果您对互斥锁的争用太多以至于这是一个问题,那么您的应用程序设计是错误的。您将所有这些线程都阻塞在互斥锁上,因此什么都不做:没有那么多线程可能会更好。

您应该设计您的应用程序,以便如果多个线程竞争互斥锁,那么哪个线程获得锁并不重要。直接争用也应该是很少见的事情,尤其是有很多线程的直接争用。

我认为这是一个 OK 场景的唯一情况是每个线程都在等待一个条件变量,然后广播以唤醒它们。然后每个线程都会争用互斥锁,但如果你这样做是对的,那么它们都应该快速检查这不是虚假唤醒,然后释放互斥锁。即便如此,这也被称为“雷霆万钧”的情况,并不理想,正是因为它序列化了所有这些线程。

关于c++ - 如何在 C++11 中防止线程饥饿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15910759/

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