// 线程函数
void ThreadFunction(int iID, std::mutex& Lock, std::condition_variable& rStart)
{
std::unique_lock<std::mutex> unqLock(Lock);
rStart.wait(unqLock);
printf("Thread ID=%c\n",'A'+iID);
}
// 主函数
int _tmain(int argc, _TCHAR* argv[])
{
std::mutex Lock;
std::condition_variable con;
std::future<void> thd=std::async(std::launch::async,ThreadFunction,0,std::ref(Lock),std::ref(con));
con.notify_one();
thd.wait();
}
程序设计是这样的,当主线程发起通知,线程函数就打印自己的线程ID
也就是线程创建完毕之后线程函数在 rStart.wait(unqLock); 处等待通知,当主线程执行 con.notify_one(); 开始打印。
但是现在有个问题,当 con.notify_one(); 的时候如果没有任何等待则通知不起任何作用,要命的是程序执行起来根本无法保证 rStart.wait(unqLock); 在 con.notify_one(); 之前运行,这就造成一个结果,调用了通知可是子线程还是被block了。
有没有什么方法能够像 Windows API 的 Event 那样,即使没有 WaitForSingleObject 等待 SetEvent 也能起作用的方法呢?