【问题标题】:How to prevent threads from starvation in C++11如何在 C++11 中防止线程饥饿
【发布时间】:2013-04-01 09:41:19
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

  • stackoverflow.com/questions/11666610/…这里有一个链接可以帮助你!!
  • 这似乎是一个设计问题而不是线程饥饿问题,您能否发布代码让人们看到它并可能提供帮助。
  • 你通常不应该有一堆线程竞争一个互斥锁——如果你的代码是只有一个线程可以同时工作的串行代码,为什么不使用更少的线程呢?有正当理由,但不都是一样的正当理由,可以有不同的答案!
  • 我有一堆线程竞争一个互斥锁的原因是我试图实现监视器设计模式来解决哲学家就餐问题。 IE。所有在共享数据上运行的方法都通过监视器公共方法同步。每个公共方法在开始时都会锁定互斥锁,检查它是否可以继续,如果不能,则暂停并等待条件变量。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多