【问题标题】:Signaling multiple threads to start working at the same time通知多个线程同时开始工作
【发布时间】:2014-03-13 15:11:48
【问题描述】:

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

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

1) 生产者拿起并准备一个请求

2) 生产者向工作线程发出信号以运行并进入睡眠状态

3) 在所有工作线程完成后,通知生产者唤醒并处理结果,工作人员进入睡眠状态

4) 重复

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

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

显然没有忙着等待,那太糟糕了。

【问题讨论】:

  • 你现在是怎么做的?显示您的代码。
  • 使用信号量,这是更简单的方法...给我们看你的,我给你看

标签: c multithreading pthreads producer-consumer


【解决方案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)具有倒计时事件或屏障等同步对象,可大大简化此操作,但基本思想是相同的。

【讨论】:

  • 此处等效的 pthreads 将是条件变量。尽管对于这个特定的问题,不太通用的 pthreads 障碍可能更适合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多