c++ condition_varition解析

#include <iostream>
#include <condition_variable>
#include <mutex>
#include <queue>
#include <deque>
#include <thread>


/*
1.condition_variable()默认构造函数
2.condition_variable(const condition_variable &)=delete 禁止拷贝
3.condition_variable& condition_variable::operator=(const condition_variable &)=delete 禁止赋值
4.notify_one() 通知一个等待的线程 如果生产的数据有一个 那么使用这个函数比较合适
5.notify_all() 通知全部等待的线程 如果生产的数据有多个 那么使用此函数
6.wait(unique_lock<mutex> lock) 阻塞当前线程 直到通知到达
7.wait(unique_lock<mutex> lock, Pred pred) 循环阻塞当前线程 直到通知到达且谓词满足

//  ======条件变量解锁过程======
//
// t1          t2         t3
// 获取锁
// wait解锁    获取锁
// 阻塞        wait解锁    获取锁
//             阻塞        wait解锁
//               |         阻塞
//               |
//               |-----------------notify.one()
//              加锁
//              处理
//              解锁

*/
using namespace std;

class Test
{
    public:
        int inCache(int count);
        int outCache();
        ~Test(){
            cout << "~Test"<< endl;
        }
    private:
        mutex m_mutex;
        condition_variable m_cond;
        queue<string> m_queue;
};

int Test::inCache(int count)
{   
    unique_lock<mutex> lk(m_mutex);
    thread::id tid = this_thread::get_id();
    string s;
    for(int i=1;i<count+1; i++)
    {
        s = to_string(i);
        m_queue.push(s);
        //cout << "write data = " << s << endl;
        //m_cond.notify_one();
        m_cond.notify_all();//通知所有线程 避免消费者>生产者 虚假唤醒
    }
    
    return count;
}

//  ======条件变量解锁过程======
//
// t1          t2         t3
// 获取锁
// wait解锁    获取锁
// 阻塞        wait解锁    获取锁
//             阻塞        wait解锁
//               |         阻塞
//               |
//               |-----------------notify.one()
//              加锁
//              处理
//              解锁
int Test::outCache()            
{
    while (true)
    {
        unique_lock<mutex> lk(m_mutex);
        //cout << "线程" << std::this_thread::get_id() << " 拿到锁" << std::endl;
        while(m_queue.empty())//避免虚假唤醒 
            m_cond.wait(lk);//1)把锁解开 2)阻塞,等待唤醒,其他线程可以拿到锁了 3)加锁
        string s = m_queue.front();
        cout << "线程" << std::this_thread::get_id() << " read queue = \"" << s << "\"" << std::endl;
        m_queue.pop();
        lk.unlock();
        this_thread::sleep_for(chrono::microseconds(1));//模拟数据处理时间 在此时间内 其他线程可以继续读取队列中的数据
    }
    return 1;
}

int main()
{
    Test test;

    //消费者
    thread r1(&Test::outCache, &test);
    thread r2(&Test::outCache, &test);
    thread r3(&Test::outCache, &test);
    thread r4(&Test::outCache, &test);

    //生产者    
    this_thread::sleep_for(chrono::seconds(1));
    thread w1(&Test::inCache, &test, 1);
    this_thread::sleep_for(chrono::seconds(2));
    thread w2(&Test::inCache, &test, 6);

    w1.join();
    w2.join();
    r1.join();
    r2.join();
    r3.join();
    r4.join();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
condition_variable_any是C++11标准引入的一个类,它是condition_variable的一个通用化版本。它可以与任何实现了BasicLockable概念的锁对象一起使用,比如std::mutex和std::shared_lock。condition_variable_any的构造函数可以通过调用`condition_variable_any()`来创建一个对象。它还提供了一些成员函数,比如wait()用于等待条件满足,notify_one()用于通知一个正在等待的线程,notify_all()用于通知所有正在等待的线程。在使用condition_variable_any时,需要手动加锁和解锁,并且要注意遵循特定的使用约定。通过使用condition_variable_any,我们可以更加灵活地处理条件变量的等待和通知。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [c++11 多线程支持 条件变量(condition_variable)(一)](https://blog.csdn.net/qq_40788199/article/details/126435885)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [C++ 多线程同步condition_variable_any的用法](https://blog.csdn.net/weixin_43369786/article/details/129326689)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值