【发布时间】:2012-08-04 02:33:43
【问题描述】:
考虑一个系统,其中一堆线程等待某些事务完成(请注意,多个线程可以等待单个事务)。为了使事务完成,其中一个线程必须运行一个调度循环。一旦当前运行调度循环的线程正在等待的事务完成,其他线程之一必须接管该工作。
在 Windows 上,这很容易实现:对于每个事务,事务完成时都会设置一个手动重置事件。此外,当调度循环退出时,会设置一个自动重置事件。每个线程同时等待两个事件。事务事件首先发出信号——在这种情况下线程退出——或者循环事件——在这种情况下线程运行调度循环。
如何在 Linux(或者更好的 Posix)上实现这一点?目前,我已经用bool 变量替换了上面的事件,并且我有一个条件变量来表示其中一个发生了变化。但是,在这种安排中,线程会虚假地唤醒(每当一个事务完成时,所有线程都会唤醒)。有没有办法更好地实现这一点?
【问题讨论】:
-
只是检查一下:您已经将
pthread_cond_wait()包装在 mutex 区域中,对吧?至于处理多个事件,semaphore 在唤醒线程之前计算您期望的预期前置条件的数量呢? -
@chrisaycock,是的,当然,其中涉及互斥锁。至于信号量的想法,请注意,我需要线程在 either 事件发生时唤醒,不一定同时发生。还是我误解了你的建议?
-
您可以通过让线程在第二个地址上休眠而不是让线程在第二个地址上休眠来假装在事务上休眠,而是让完成事务的进程向等待它的线程发出信号,该线程捕获信号并退出
标签: c++ c linux pthreads posix