我正在寻找以下算法的Windows上多线程实现的建议和代码示例:
input1
,继续工作,通知Thread2
,继续工作。input2
,继续工作,等待来自thread2的通知,进行一些处理,通知Thread3
,继续工作。input3
,继续工作,等待来自thread3的通知,进行一些处理,通知Thread4
,继续工作。
等。由于我是C ++的新手,我不确定选择在线程之间发送/接收通知的机制。
我考虑了几种方法:mutex
,semaphore
,critical section
,但这些似乎主要是锁定,而不是等待通知。
答案 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::thread的native_handle方法主要保留在标准库中,但我从未对此进行过测试。如果有效,请告诉我。