条件变量

1

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

std::mutex mtx;
std::condition_variable conVarible;
std::queue<int> msgQueue;

void consumer()
{	
	while (true)
	{
		std::unique_lock<std::mutex> lck(mtx);
		conVarible.wait(lck);
		std::cout << "get msg: " << msgQueue.front() << std::endl;
		msgQueue.pop();
	}
}

void product()
{
	int i = 0;
	while(true)
	{
		std::this_thread::sleep_for(std::chrono::seconds(1));
		std::unique_lock<std::mutex> lck(mtx);
		msgQueue.push(++i);
		conVarible.notify_one();
	}
}


int main()
{
	std::thread thread_consumer(consumer);
	std::thread thread_product(product);

	std::cout << "thread start finished" << std::endl;
	thread_consumer.join();
	thread_product.join();

	return 0;
}

2.

#include<iostream>
#include<mutex>
#include<condition_variable>
#include<queue>
#include<chrono>
#include"CCmdParser.hpp"

class CCmdQueue
{
public:
	CCmdQueue();
	~CCmdQueue();

	void enque(msg sigMsg);
	msg dequque(void);

private:
	std::queue<msg> m_msgQueue;

	std::mutex mtx;
	std::condition_variable convar;
};


CCmdQueue::CCmdQueue()
{
}


CCmdQueue::~CCmdQueue()
{
}

void CCmdQueue::enque(msg sigMsg)
{
	std::lock_guard<std::mutex> lck(mtx);
	m_msgQueue.push(sigMsg);
	convar.notify_one();
}

msg CCmdQueue::dequque(void)
{
	std::unique_lock<std::mutex> lck(mtx);
	while (m_msgQueue.empty())
	{
		//等待在lck上的时候,wait函数会先自动调用lck.unlock()释放锁。
		//收到通知后解除wait时,wait又会自动调用lck.lock()获取锁。
		convar.wait(lck);
	}

	msg tmp = m_msgQueue.front();
	m_msgQueue.pop();

	return tmp;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值