首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C++11中防止线程饥饿

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

Stack Overflow用户
提问于 2013-04-10 03:24:04
回答 1查看 5.2K关注 0票数 11

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

我有一堆线程在竞争一个互斥量。现在,我的问题是,离开临界区的线程立即开始竞争相同的互斥,并且大部分时间是获胜的。因此,在互斥上等待的其他线程是饥饿的。

我不想让离开临界区的线程休眠一段最短的时间,以便让其他线程有机会锁定互斥锁。

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

我发现了std::this_thread::yield()函数,它假定重新调度线程的执行顺序,但它只是对调度器线程的提示,它是否重新调度线程取决于调度器线程的实现。

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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-07-03 16:32:26

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

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

你应该设计你的应用程序,如果多个线程竞争一个互斥锁,那么哪个线程获得锁就无关紧要了。直接争用也应该是很少见的事情,特别是有很多线程的直接争用。

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15910759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档