C++11 并发与多线程学习记录(七)

std::conditon_variable、wait、notify_one、notify_all

std::conditon_variable需要和互斥量配合工作,使用的时候需要生成该类的对象。

wait函数:wait()函数传入一个互斥量和返回bool的可调用对象。如果返回true,那么wait直接返回,否则wait解锁互斥量并阻塞到本行,直到某个线程调用notify_one为止。
如果wait没有第二个参数。那么就跟第二个参数返回false一样。直到其他线程调用notify_one为止。
当其他线程调用notify_one将正在wait的线程唤醒后,wait就将不断获取互斥量,一直到获取成功。
获取到锁后有三种情况:
1. 如果wait有第二个参数,并且返回false。wait将继续解锁互斥量并阻塞。
2. 如果返回true,则往下执行。
3. 如果没有第二个参数。则往下执行。

notify_one:解锁正在等待当前条件的线程中的一个,如果没有线程在等待,则函数不执行任何操作,如果正在等待的线程多余一个,则唤醒的线程是不确定的。
notify_all:唤醒所有正在等待的线程。

#include <iostream>
#include <string>
#include <thread>
#include <list>
#include <mutex>
 
class MesProcess
{
public:
	void Inmsglist()
	{
		for (int i = 0; i < 10000; i++)
		{
 
			std::unique_lock<std::mutex> uniqlock(my_mutex);
			std::cout << "Inmsglist线程正在执行,插入数字为:" << i << std::endl;
			msglist.push_back(i);
			my_cond.notify_one();  //尝试把wait和线程唤醒,执行完这里wait就会被唤醒
			//如果添加线程Outmsg_thread2则需要将此处更换为notify_all更稳定
		}
	}
 
	
	void Outmsglist()
	{
		int command = 0;
		while (true)
		{
			std::unique_lock < std::mutex > uniqlock(my_mutex);
			my_cond.wait(uniqlock, [this] {           //这里的判断条件为lambda表达式,判断信息队列是否为空,为空返回false,否则返回true
				if (!msglist.empty())                 //调用wait函数
					return true;
				return false;
			});
			command = msglist.front();
			msglist.pop_front();
			std::cout << "Outmsglist线程"<<std::this_thread::get_id()<<"正在执行,取出数字为:" << command << std::endl;
			uniqlock.unlock();
			
		}
	}
private:
	std::list<int> msglist;
	std::mutex my_mutex;
	std::condition_variable my_cond;   //生成一个条件变量对象
};
 
int main()
{
	std::cout << "主线程的线程id为: " << std::this_thread::get_id() << std::endl;
 
	MesProcess mpobj;
	std::thread Outmsg_thread(&MesProcess::Outmsglist, &mpobj);
	//std::thread Outmsg_thread2(&MesProcess::Outmsglist, &mpobj);
	std::thread Inmsg_thread(&MesProcess::Inmsglist, &mpobj);
 
	Inmsg_thread.join();
	Outmsg_thread.join();
	//Outmsg_thread2.join();
 
	std::cout << "主线程运行结束" << std::endl;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值