我有一台接受客户端数据的服务器。数据以不规则的间隔大量出现。我有一个线程保持连接打开,从缓冲区读取数据并将它们放入队列。我有另一个线程来接收请求,准备它们进行计算然后它应该将它们交给工作线程。
我有4个工作线程。这是生产者 - 消费者情景。我为每个线程制定了逻辑,但我需要弄清楚如何做这个场景:
1)制片人选择并准备请求
2)生产者发信号通知工作线程运行并进入休眠状态
3)完成所有工作线程后,信号发生器唤醒并处理结果,工人进入休眠状态
4)重复
如何告知所有工人醒来?我不能使用信号量,因为我需要让所有4个工人同时运行。我也不想在完成后删除工作程序并为每个请求创建新工作程序(我想重用线程)。
每个工作人员都有while(true)
个循环。我想在循环开始时停止每个线程,然后在生成器中将它们唤醒,等待它们全部完成并在while循环信号生成器的末尾。
显然没有忙等待,这很糟糕。
答案 0 :(得分:1)
您可以使用事件对象执行此操作。在Windows中,您使用Event。
基本上,事件最初没有信号,所有线程都在等待它。当生产者想要线程启动时,它会向事件发出信号。等待它的所有线程都被释放。
当然,你也可能想要一个停止事件,这样在线程发出信号后,生产者就会停止。它看起来像这样。
start_event = new event
stop_event = new event
在生产者方面:
do forever
get data
start_event.signal
// wait for all threads to signal that they're done
// clear the start event so that threads won't go past it
start_event.clear
// allow threads to go back to waiting for new data
stop_event.signal
// wait for all threads to signal that they're ready
// and then reset the stop event
stop_event.clear
在消费者方面:
do forever
wait for start event
process data
signal producer
// wait here for producer to release
wait for stop event
// signal producer that thread cleared the stop event
某些线程库(如.NET CLR)具有同步对象,如倒计时事件或屏障,可以简化这一点,但基本思路是相同的。