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

时间:2013-04-09 19:24:04

标签: c++ multithreading c++11 locking

我只是想知道C ++ 11中是否存在阻止线程饥饿的锁定策略。

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

我不想让线程留下一个关键部分,在最短的时间内休眠,让其他线程有机会锁定互斥锁。

我认为必须有一些参数能够为等待互斥锁的线程实现公平锁定,但是我找不到任何合适的解决方案。

我发现std :: this_thread :: yield()函数,它假设重新调度线程执行的顺序,但它只提示调度程序线程,如果重新调度线程,则依赖于调度程序线程实现。 / p>

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

由于

1 个答案:

答案 0 :(得分:6)

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

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

您应该设计应用程序,以便在多个线程争用互斥锁时,哪个线程获得锁定无关紧要。直接争用也应该是一种罕见的事情,尤其是对大量线程的直接争用。

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