C++多线程 (4):条件变量

条件变量std::condition_variable

        简述:std::condition_variable    是一个类

        成员函数:

                1.  wait(std::unique_lock&)    没有第二个参数时默认返回值为false 对

                        当前互斥量解锁并阻塞当前线程

                 原理:先解锁,然后一直获取锁,直接堵死

                2. wait(std::unique_lock&,条件函数)    等待一个条件成立

                        如果条件函数返回true,则等待成功,代码继续往下执行,

                        如果返回false,则没有等到想要的条件结果,继续闹脾气,

                   对当前互斥量解锁并阻塞当前线程,直到某个线程调用notify_one()成员函数,

                 通知wait()再判断一下条件

                原理:先解锁,然后判断条件,若为真true,则拿到锁,线程往下执行;  否则等待

                        notify_one() 被调用,被通知后再判断条件是否成立,若成立,则拿到锁,线程往

                        下执行;

                3. notify_one()    通知一个线程中的wait()函数判断条件

                4. notify_all()    通知所有线程中的wait()函数判断条件

#include
#nclude
#include

using namespace std;
int main(void)
{
    //定义条件变量
    std::condition_variable condition;
    //条件函数
    auto func_condition = [] {
	    static int cnt = 0;
	    cnt++;
	    return cnt % 2 == 0;
	    };

    //定义独锁
    std::mutex mtx;

    //用Lambda表达式作为线程函数
    auto func_thread = [&] {
	    cout << "Lambda线程通道开始执行......" << endl;

	    //定义独锁
	    std::unique_lockulock(mtx);
	    //判断是否满足条件,若不满足,则卡在这里不走
	    condition.wait(ulock,func_condition);

	    cout << "Lambda线程通道执行结束......" << endl;
	    };
    //线程提醒函数
    auto func_nodify = [&] {

	    //线程延迟执行1s,等线程func_thread闹脾气
	    std::this_thread::sleep_for(std::chrono::seconds(1));
	    //提醒所有线程函数注意重新判断一下条件
	    condition.notify_all();

	    };

    //创建两个线程
    thread t1(func_thread);
    thread t2(func_nodify);

    t1.join();
    t2.join();

    return 0;
}

你可能感兴趣的:(C++多线程,c++)