c++11 关于 std::condition_variable 的问题
先上代码
程序设计是这样的,当主线程发起通知,线程函数就打印自己的线程ID
也就是线程创建完毕之后线程函数在 rStart.wait(unqLock); 处等待通知,当主线程执行 con.notify_one(); 开始打印。
但是现在有个问题,当 con.notify_one(); 的时候如果没有任何等待则通知不起任何作用,要命的是程序执行起来根本无法保证 rStart.wait(unqLock); 在 con.notify_one(); 之前运行,这就造成一个结果,调用了通知可是子线程还是被block了。
有没有什么方法能够像 Windows API 的 Event 那样,即使没有 WaitForSingleObject 等待 SetEvent 也能起作用的方法呢?
// 线程函数
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 也能起作用的方法呢?
...全文
相关推荐
CPP11ThreadProgramming
```cpp#include <condition_variable>std::condition_variable cv;std::unique_lock<std::mutex> lock(mtx);
cpp_lib:C ++ライブラリかも
**多线程(Multithreading)**:如果cpp_lib涉及并发编程,它可能包含了对C++11及更高版本中的std::thread、mutex、condition_variable等多线程特性的使用
CPP-Summit 2019演讲讲义.zip
- 并发与多线程:C++11引入的std::thread库,以及同步原语如互斥锁(mutex)、条件变量(condition_variable)等。
c++通过结构体(struct)全局变量在多线程中传递参数
`Makefile`可能如下所示:```makefileCC = g++CFLAGS = -std=c++11 -lpthreadall: $(CC) $(CFLAGS) main.cpp -o my_program
C++11多线程条件变量详解[项目代码]
除了std::condition_variable之外,C++11还提供了std::condition_variable_any类型,它是std::condition_variable的泛化版本,允许使用任何类型的锁


