028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

【并发编程十】c++线程同步——条件变量(condition-创新互联

【并发编程十】c++线程同步——条件变量(condition_variable)

简介:
本篇文章,我们详细的介绍下c++标准库提供的线程同步方法——条件变量(condition_variable)。

永春网站建设公司创新互联,永春网站设计制作,有大型网站制作公司丰富经验。已为永春成百上千提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的永春做网站的公司定做!一、互斥

参见【并发编程九】c++线程同步——互斥(mutex)

二、条件变量 1、为何要引入条件变量?

我们需要一种机制,当互斥量被锁住以后发现当前线程还是无法完成自己的操作,那么它应该释放互斥量,让其他线程哦工作。

2、不使用条件变量
#include#include#include#include#includeusing namespace std;

mutex mtx;
dequeq;

//线程A,producer
void task1()
{int i = 0;
    while(true)
    {unique_locklock(mtx);
        if (q.size()< 1000)
        {if (i< 999)
            {q.push_back(i);
                i++;
            }
            else
            {i = 0;
            }
        }
        else
        {// std::this_thread::sleep_for(std::chrono::seconds(1));;
        }
    }
}

//线程B,consumer
void task2()
{int da = 0;
    while (true)
    {unique_locklock(mtx);
        if (!q.empty())
        {da = q.front();
            q.pop_front();
            cout<< "get value from que:"<< da<< endl;
            cout<< "que.size:"<< q.size()<cout<< "que.size:"<< q.size()<< endl;
    thread t2(task2);
    thread t1(task1);
 
    t1.join();
    t2.join();
}

在这里插入图片描述

3、使用条件变量 3.1、互斥锁有什么问题?3.2、条件变量

条件变量是允许多个线程相互交流的同步原语。它允许一定量的线程等待(可以定时)另一线程的提醒,然后再继续。条件变量始终关联到一个互斥。
定义于头文件

3.3、条件变量成员函数
通知成员函数解释
notify_one通知一个等待的线程(公开成员函数)
notify_all通知所有等待的线程(公开成员函数)
等待成员函数解释
wait阻塞当前线程,直到条件变量被唤醒(公开成员函数)
wait_for阻塞当前线程,直到条件变量被唤醒,或到指定时限时长后(公开成员函数)
wait_until阻塞当前线程,直到条件变量被唤醒,或直到抵达指定时间点(公开成员函数)

简单说下,如果是新人,简单理解wait和notify_one两个函数就行了,基本就明白了条件变量的原理,如下面的demo,wait就是等待notify的通知后再执行

3.4、demo
#include#include#include#include#include#includeusing namespace std;

mutex mtx;
dequeq;
condition_variable cv;

//线程A,producer
void task1()
{int i = 0;
    while(true)
    {unique_locklock(mtx);
        if (q.size()< 1000)
        {if (i< 99)
            {q.push_back(i);
                cv.notify_one();//cv.notify_all();
                i++;
            }
            else
            {i = 0;
            }
        }
        else
        {cv.notify_one();
            //std::this_thread::sleep_for(std::chrono::seconds(1));;
        }
    }
}

//线程B,consumer
void task2()
{int da = 0;
    while (true)
    {unique_locklock(mtx);
        if (q.empty())//如果有多个消费者,此处应该为while(q.empty())
        {cv.wait(lock);
        }
        da = q.front();
        q.pop_front();
        cout<< "get value from que:"<< da<< endl;
        cout<< "que.size:"<< q.size()<< endl;
    }
}

int main()
{cout<< "que.size:"<< q.size()<< endl;
    thread t2(task2);
    thread t1(task1);
 
    t1.join();
    t2.join();
}

在这里插入图片描述

在这里插入图片描述

3.4、总结

参考:
1、https://www.apiref.com/cpp-zh/cpp/thread.html
2、https://en.cppreference.com/w/cpp/thread
3、书籍《c++服务器开发精髓》——张远龙

三、future四、信号量

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页名称:【并发编程十】c++线程同步——条件变量(condition-创新互联
文章地址:http://www.tsicrk.com/article/dsspjc.html

其他资讯

让你的专属顾问为你服务

2.2694s