【发布时间】:2011-09-20 22:34:01
【问题描述】:
在多线程 Linux 应用程序中,我将互斥锁用于关键部分。除了公平问题外,这非常有效。一个线程离开临界区并立即重新进入可能不会给任何其他线程机会。例如
while(true)
{
critsect.enter();
... do calculations ...
... maybe call a blocking operation so we sleep ...
critsect.leave();
}
很可能会阻止任何其他线程进入相同的临界区。互斥是不公平的。
是否有解决方案来制作公平的关键部分?我正在考虑添加一个队列,以便关键部分按照它们的“到达”顺序执行。或者,如果其他线程正在等待,至少有一个计数器可以在解锁后执行 pthread_yield()。
对于这种要求有推荐的做法吗?
【问题讨论】:
-
您能否发布有关您的公平声明的权威资源。恕我直言,我认为
It can happen that a thread leaving a critical section and re-entering right away does not give any other thread a chance不是真的。 -
当互斥锁被解锁时,线程继续运行。特别是。当在解锁之前有一个线程切换(例如阻塞操作)时,线程极有可能不间断地进入下一个锁。现在,pthread_mutex 是一个非排队互斥体,所以即使其他一些(当前不活动的)线程在锁定调用上阻塞,我也可以锁定它。我没有明确的资源来记录这一点,但 stackoverflow 问题 3045066 显示了一个示例,您可以直接运行它(在单核系统上)。
-
在临界区阻塞或休眠不是一个好主意,因为其他线程无法利用这个休眠时间轮到它
标签: linux pthreads mutex critical-section