当前位置: 首页 > Linux

C++ 并发编程之互斥锁和条件变量的性能比较

时间:2023-04-06 04:31:23 Linux

C++并发编程中互斥量和条件变量的性能比较条件变量的性能比较。本例中的生产者-消费者模型有1个生产者和5个消费者。生产者线程将数据放入队列,5个消费者线程从队列中取数据。在取数据之前,需要判断队列中是否有数据。这个队列是一个全局队列,是线程之间共享的数据,所以需要互斥。锁定保护。即当生产者往队列中放入数据时,其他消费者不能拿,反之亦然。互斥锁实现代码#include//std::cout#include//std::deque#include//std::thread#include//std::chrono#include//std::mutex//全局队列std::dequeg_deque;//全局锁std::mutexg_mutex;//生产者运行标志boolproducer_is_running=true;//生产者线程FunctionvoidProducer(){//股票数量intcount=8;do{//智能锁,初始化后加锁,保护范围在代码花括号内,花括号退出时自动解锁//可手动解锁,实现细粒度控制互斥std::unique_lock储物柜(g_mutex);//入队一个数据g_deque.push_front(count);//提前解锁减少细粒度互斥量,只对共享队列数据进行同步保护locker.unlock();std::cout<<"生产者:我现在有库存:"<0);//将生产者标记为打样producer_is_running=false;std::cout<<"生产者:我没货了,我要打样!"<locker(g_mutex);if(!g_deque.empty()){data=g_deque.back();g_deque.pop_back();locker.unlock();std::cout<<"Consumer["<储物柜(g_mutex);如果(!g_deque.empty()){数据=g_deque.back();g_deque.pop_back();储物柜.解锁();std::cout<<"Consumer["<//std::cout#include//std::deque#include//std::thread#include//std::chrono#include//std::mutex#include//std::condition_variable//全局队列std::dequeg_deque;//全局锁std::mutexg_mutex;//全局条件变量std::condition_variableg_cond;//生产者运行标志boolproducer_is_running=true;//生产者线程函数voidProducer(){//库存数量intcount=8;do{//智能锁,初始化后上锁,保护范围是花括号内的代码,当花括号退出时会自动解锁//可以手动解锁控制细粒度互斥量std::unique_lock储物柜(g_mutex);//入队一个数据g_deque.push_front(count);//提前解锁,降低互斥体的细粒度,只对共享队列数据进行同步保护locker.unlock();std::cout<<"生产者:我现在有库存:"<0);//将生产者标记为证明producer_is_running=false;//唤醒所有消费者线程g_cond.notify_all();std::cout<<"生产者:我的存货没了,我要打样!"<locker(g_mutex);//wait()函数会先调用mutex的unlock()函数,然后自己休眠。被唤醒后,会继续持有锁,保护后续的队列操作。//必须使用unique_lock而不是lock_guard,因为lock_guard没有加锁和解锁接口,而unique_lock提供了g_cond.wait(locker);//队列不为空if(!g_deque.empty()){//取出队列中最后一个数据data=g_deque.后退();//删除队列中的最后一个数据g_deque.pop_back();//提前解锁,减少细粒度互斥锁,只保护共享队列数据locker.unlock();std::cout<<"消费者["<

猜你喜欢