【发布时间】:2015-09-12 00:06:55
【问题描述】:
我正在开发一个程序,当一个线程比另一个线程做更多的工作时,它会遭受饥饿。临界区受可重入 QMutex 保护,这是不公平的。
在 Java 中,您可以为锁指定公平参数。 C++(或 boost 库)是否有任何可用的公平可重入锁?最好到 C++11。
我之前做过一些研究,boost中有shared_lock,但我不需要读/写锁。只是一个锁,可以保证每个线程都有平等的机会进入临界区。
非常感谢。
【问题讨论】:
-
自 C++11 起就有
std::mutex和std::lock_guard<std::mutex>,但不能保证它们是公平的。不过,我相信 MSVC CRT 实现使用等待队列,因此它们在该平台上可能是公平的。 -
是的..但我需要一个公平的锁...
-
与其使用在 C++ 中通常不可用的公平参数,您可能会发现您可以通过优先排队工作调度来获得对情况的更多控制,这样您就可以将“繁重”操作节流到避免饥饿。显然,它需要更多的编码,但从长远来看可能会给您带来更好的结果。
-
从操作系统的角度来看,所有线程都有相似的运行机会,所以如果你没有为你的线程设置不同的优先级并且在某些线程上发生饥饿,这意味着这些线程没有被操作系统线程分配足够的时间调度程序,但是这不会发生。这反映出您的设计可能存在问题
标签: c++ concurrency