c++11 thead条件变量
condition_variable类是一个同步原语,可以被用来阻塞一个线程或者同时阻塞多个线程,直到另一个线程既修改了共享变量(即“条件”),也做了通知。
想要修改共享变量(即“条件”)的线程必须:
1. 获得一个std::mutex(一般来说是通过std::lock_guard获得)
2. 当持有锁的时候,执行修改动作
3. 对std::condition_variable执行notify_one或notify_all(当做notify动作时,不必持有锁)
即使共享变量是原子性的,它也必须在mutex的保护下被修改,这是为了能够将改动正确发布到正在等待的线程。
任意要等待std::condition_variable的线程必须:
1. 获取std::unique_lock<std::mutex>,这个mutex正是用来保护共享变量(即“条件”)的
2. 执行wait, wait_for或者wait_until. 这些等待动作原子性地释放mutex,并使得线程的执行暂停
3. 当获得条件变量的通知,或者超时,或者一个虚假的唤醒,那么线程就会被唤醒,并且获得mutex. 然后线程应该检查条件是否成立,如果是虚假唤醒,就继续等待。
#include <thread> #include <mutex> #include <condition_variable> using namespace std; std::mutex m; std::condition_variable cv; void funthread1(int num) { std::unique_lock<std::mutex> lk(m); //若已上锁,则阻塞 cv.wait(lk);// 调用wait时先解锁并阻塞,接受到信号时再加锁往下执行 qDebug() << "threadnum="<< num; lk.unlock(); sleep(3); cv.notify_one(); } void funthread2(int num) { std::unique_lock<std::mutex> lk(m); //若已上锁,则阻塞 cv.wait(lk); // 调用wait时先解锁并阻塞,接受到信号时再加锁往下执行 qDebug() << "threadnum="<< num; } void MainWindow::initThreadWait() { std::thread t1(funthread1, 1); sleep(3); cv.notify_one(); std::thread t2(funthread2, 2); t2.join(); }
坚持就是胜利

浙公网安备 33010602011771号