2014-03-13 44 views
-1

我有一台接受客户端数据的服务器。数据以不规则的间隔进入大块。我有一个线程保持连接打开,从缓冲区读取数据并将其放入队列。我有另一个线程提取请求,为计算做好准备,然后将它们交给工作线程。发信号通知多个线程同时开始工作

我有4个工作线程。这是一个生产者 - 消费者场景。我必须为每个线程的逻辑制定出来,但我需要弄清楚如何做到这一点的场景:

1)生产回升,并准备请求

2)生产者信号的工作线程运行,去睡觉

3)所有的工作线程完成后,信号产生唤醒和处理结果,工人们睡觉

4)重复

如何信号中的所有工人醒过来?我不能使用信号量,因为我需要让所有4名工作人员同时运行。我也不想删除工作完成后的工作,并为每个请求创建新的工作(我想重用线程)。

每个工人都有while(true)循环。我想在循环开始时停止每个线程,然后在生产者中唤醒它们,等待它们全部完成并且在while循环信号生成器的末尾。

显然没有忙等待,那只是不好的。

+0

你现在怎么做?显示你的代码。 – this

+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)有像倒计时事件或障碍同步对象简化这一点相当多,但基本的想法是一样的。

+1

这里等价的线程将是条件变量。虽然对于这个特定的问题,不太普遍的线程障碍可能更适合。 – ComicSansMS