用于通知等待模式的C ++多线程算法设计

时间:2015-09-08 22:35:37

标签: c++ multithreading

我正在寻找以下算法的Windows上多线程实现的建议和代码示例:

  • 主题1:选择input1,继续工作,通知Thread2,继续工作。
  • 线程2:选择input2,继续工作,等待来自thread2的通知,进行一些处理,通知Thread3,继续工作。
  • 线程3:选择input3,继续工作,等待来自thread3的通知,进行一些处理,通知Thread4,继续工作。 等。

由于我是C ++的新手,我不确定选择在线程之间发送/接收通知的机制。
我考虑了几种方法:mutexsemaphorecritical section,但这些似乎主要是锁定,而不是等待通知。

2 个答案:

答案 0 :(得分:3)

除了您已列出的常用助手外,您还应该查看condition variable

  

condition_variable类是可以的同步原语   用于同时阻塞线程或多个线程,   直到:        - 从另一个线程收到通知       [...]

当使用条件变量时,线程2可以等到它被“通知”,因此线程2可以继续,依此类推。这是一个简单的例子:

std::mutex mtx;
std::condition_variable cv;
static bool ready = false;

static void set ()
{
  {
    std::unique_lock<std::mutex> lck(mtx);
    while (!ready)
      cv.wait(lck);
  }

  std::cout << "message received" << std::endl;
}

static void go()
{
  std::unique_lock<std::mutex> lck(mtx);
  ready = true;

  // here we set the condition variable for thread1
  cv.notify_all();
}

int main ()
{
  std::thread thread1 = std::thread(set);

  go();
  thread1.join();
  return 0;
}

答案 1 :(得分:0)

假设每个线程的任务函数看起来像这样:

void threadfunc()
{
    MSG winmsg;
    BOOL rval;

    while (GetMessage(&winmsg, (HWND__ *) -1, 0, 0) != -1)
    {
        DoThreadProcessing();
    }
    // GetMessage failed. Find out why and try to recover or die gracefully
}

这会阻塞GetMessage,直到线程被下一个函数发送的消息到达而被唤醒

bool PostMsg(DWORD & ThreadId)
{
    if (PostThreadMessage(ThreadId,
                          WM_USER,
                          (WPARAM) NULL,
                          0); != 0)
    {
        return true;
    }
    else
    {
        // failed. Find out why and try to recover or die gracefully
        return false;
    }
}

通过PostThreadMessage的魔力。

如果您关心发送的是哪种邮件,您可以在Msg参数中发送简单信息,例如数字,并从winmsg.message中提取。保持数字较小,因为Windows使用message的上半部分来实现它自己的恶意目的。

如果您需要更复杂的消息,Mutex not correctly used? Continuation of past questions涵盖了这一点。

所以在OP的情况下,线程1用线程2的句柄调用PostMsg来唤醒线程2.线程2用线程3的句柄调用PostMsg,依此类推。

您甚至可以使用std::threadnative_handle方法主要保留在标准库中,但我从未对此进行过测试。如果有效,请告诉我。