我只是想知道C++11中是否有任何锁定策略可以防止线程饥饿。
我有一堆线程在竞争一个互斥量。现在,我的问题是,离开临界区的线程立即开始竞争相同的互斥,并且大部分时间是获胜的。因此,在互斥上等待的其他线程是饥饿的。
我不想让离开临界区的线程休眠一段最短的时间,以便让其他线程有机会锁定互斥锁。
我认为一定有一些参数可以为等待互斥的线程启用公平锁定,但我找不到任何合适的解决方案。
我发现了std::this_thread::yield()函数,它假定重新调度线程的执行顺序,但它只是对调度器线程的提示,它是否重新调度线程取决于调度器线程的实现。
有没有办法为C++11中等待同一互斥锁的线程提供公平的锁定策略?通常的策略是什么?
谢谢
发布于 2013-07-03 16:32:26
这是互斥锁中的一种常见优化,旨在避免在同一线程可以再次使用互斥锁时浪费时间切换任务。如果当前线程在其时间片中还有剩余时间,那么您可以通过让它获取互斥而不是挂起它,并切换到另一个线程(这可能会导致大量重新加载高速缓存线和各种其他延迟),从而获得每秒执行的用户指令的更多吞吐量。
如果您在互斥锁上有太多的争用,这是一个问题,那么您的应用程序设计就是错误的。您在一个互斥锁上阻塞了所有这些线程,因此什么也不做:没有这么多线程可能会更好。
你应该设计你的应用程序,如果多个线程竞争一个互斥锁,那么哪个线程获得锁就无关紧要了。直接争用也应该是很少见的事情,特别是有很多线程的直接争用。
我认为这是一个OK场景的唯一情况是,每个线程都在等待一个条件变量,然后广播该变量来唤醒所有线程。然后每个线程都会争用互斥锁,但如果你做得对,那么它们都应该快速检查一下这不是一个虚假的唤醒,然后释放互斥锁。即使这样,这种情况也被称为“雷鸣般的羊群”,这并不理想,因为它序列化了所有这些线程。
https://stackoverflow.com/questions/15910759
复制相似问题