发信号通知多个线程同时开始工作

时间:2014-03-13 15:11:49

标签: c multithreading pthreads producer-consumer

我有一台接受客户端数据的服务器。数据以不规则的间隔大量出现。我有一个线程保持连接打开,从缓冲区读取数据并将它们放入队列。我有另一个线程来接收请求,准备它们进行计算然后它应该将它们交给工作线程。

我有4个工作线程。这是生产者 - 消费者情景。我为每个线程制定了逻辑,但我需要弄清楚如何做这个场景:

1)制片人选择并准备请求

2)生产者发信号通知工作线程运行并进入休眠状态

3)完成所有工作线程后,信号发生器唤醒并处理结果,工人进入休眠状态

4)重复

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

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

显然没有忙等待,这很糟糕。

1 个答案:

答案 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)具有同步对象,如倒计时事件或屏障,可以简化这一点,但基本思路是相同的。