美文网首页
C++11条件变量

C++11条件变量

作者: NullUser | 来源:发表于2022-12-12 12:08 被阅读0次

    std::condition_variable

    void wait (unique_lock& lck)会无条件的阻塞当前线程然后等待通知,前提是此时对象lck已经成功获取了锁。等待时会调用lck.unlock()释放锁,使其它线程可以获取锁。一旦得到通知(由其他线程显式地通知),函数就会释放阻塞并调用lck.lock(),使lck保持与调用函数时相同的状态。

    示例

    #include <iostream>
    #include <sstream>
    #include <condition_variable>
    #include <mutex>
    #include <thread>
    
    std::mutex mMute;
    std::condition_variable cv;
    
    void testFun1()
    {
        std::stringstream ss;
        ss << "thread:" << std::this_thread::get_id() << ",start wait\n";
        std::cout << ss.str();
    
        std::unique_lock<std::mutex> lk(mMute);  //2.
        cv.wait(lk, [] {return condition; });
    
        ss.clear();
        ss.str("");
        ss << "thread:" << std::this_thread::get_id() << ",condition met\n";
        std::cout << ss.str();
    }
    
    void testFun2()
    {
    
        std::stringstream ss;
        ss << "thread:" << std::this_thread::get_id() << ",first notify\n";
        std::cout << ss.str();
        cv.notify_all(); //4.
    
        ss.clear();
        ss.str("");
        ss << "thread:" << std::this_thread::get_id() << ",start sleep\n"; //5.
        std::cout << ss.str();
    
        std::this_thread::sleep_for(std::chrono::seconds(10));
    
        ss.clear();
        ss.str("");
        ss << "thread:" << std::this_thread::get_id() << ",sleep finish, change condition and notify again\n";
        std::cout << ss.str();
    
        std::unique_lock<std::mutex> lk(mMute); //6.
        condition = true;
        cv.notify_all();
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }
    
    int main()
    {
        std::thread t1(testFun1);  //1.
        std::this_thread::sleep_for(std::chrono::seconds(1)); //3.
        std::thread t2(testFun2);
        t1.join();
        t2.join();
    
        return 0;
    }
    
    1. 在main()中开启线程运行testFun1()
    2. testFun1()获取锁,判断条件,此时条件不满足,释放锁,并阻塞当前线程,等待通知。
    3. 主线程休眠1秒后开启线程运行testFun2()
    4. testFun2()中通知条件变量,此时testFun1()所在线程被激活,获取锁,并判断条件,此时仍不满足,释放锁后继续等待。
    5. 与此同时,testFun2()所在线程开始休眠10秒。
    6. 10秒后,testFun2()所在线程获取锁,并修改条件为true,执行通知并休眠5秒,testFun1()所在线程收到通知后,开始获取锁,由于testFun2()线程扔持有锁,所有testFun1()等待,5秒钟后testFun2()释放锁,testFun1()取得锁后判断条件满足,开始往后执行。

    相关文章

      网友评论

          本文标题:C++11条件变量

          本文链接:https://www.haomeiwen.com/subject/evaqqdtx.html