如何防止线程在C ++ 11中挨饿

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

我有一堆线程正在争夺一个互斥体。 现在,我的问题是,离开关键部分的线程立即开始竞争相同的互斥体,并且大部分时间赢得胜利。 因此等待互斥体的其他线程正在挨饿。

我不想让线程留下临界区睡眠一段时间,让其他线程有机会锁定互斥锁。

我认为必须有一些参数能够对等待互斥体的线程进行公平的锁定,但我无法找到任何合适的解决方案。

那么我发现std :: this_thread :: yield()函数,它假设重新调度线程执行的顺序,但它只是暗示调度器线程,并且依赖调度器线程实现,如果它重新调度线程或不。

有没有办法如何为在C ++ 11中等待相同互斥体的线程提供公平的锁定策略? 通常的策略是什么?

谢谢


这是互斥体中的一种常见优化,旨在避免浪费时间切换任务,因为同一个线程可能再次接受互斥体。 如果当前线程在其时间片中还剩下时间,那么通过让用户指令执行每秒执行,而不是暂停它,并切换到另一个线程(这可能会导致大量缓存行重新载入和其他各种延迟)。

如果你对互斥体有太多的争议,这是一个问题,那么你的应用程序设计是错误的。 你将所有这些线程都阻塞在互斥体上,因此不会做任何事情:如果没有太多线程,你可能会更好。

您应该设计您的应用程序,以便如果多个线程竞争互斥量,那么哪个线程获取锁并不重要。 直接争用也应该是一件罕见的事情,特别是与大量线程的直接争用。

唯一的情况是,我可以认为这是一个正确的情况,每个线程都等待一个条件变量,然后广播它们将其全部唤醒。 然后,每个线程都会争夺互斥锁,但是如果你这样做的话,他们应该尽快检查一下,这不是虚假唤醒,然后释放互斥锁。 即便如此,这被称为“雷鸣群”的情况,并不理想,正是因为它将所有这些线程序列化。

链接地址: http://www.djcxy.com/p/30757.html

上一篇: How to prevent threads from starvation in C++11

下一篇: Read whole ASCII file into C++ std::string