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();
}

 

posted @ 2020-05-09 18:09  wjbooks  阅读(665)  评论(0)    收藏  举报