栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++11 线程间数据同步的简单演示模型(std::condition

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++11 线程间数据同步的简单演示模型(std::condition

线程间同步,本次使用条件变量 std::condition_variable 来进行演示

力求一个较为简单,易懂,代码量少的演示过程

线程间同步的作用,就不写了,相信是经常用到的

前景须知:

场景:

        生成产品 --> 仓库 --> 销售产品

        ***仓库最大容量假设是 1 个

接下来是代码过程

1、条件变量需要配合 mutex 来使用std::unique_lock进行上锁/解锁使用,所以,包含一些必要的头文件

#include 
#include 
#include 

2、声明一些变量,这里方便演示设置全局或静态变量

static int value  = 0;			// 产品数量
static bool ready = false;		// 产品准备好标志
std::mutex lock_mutex;			// 线程互斥量 
std::condition_variable c_var;  // 条件变量

3、接下来是工厂函数 funB() 和 funC()

// 工厂生产产品
void funB()
{
	while (true){
		std::unique_lock  lock(lock_mutex);

		// 生产产品过程
		std::cout << "生产了产品,库存为:" << ++value << std::endl;

		// 产品生产完毕
		ready = true;
		c_var.notify_all(); // 通知销售部可以卖产品了
		c_var.wait(lock);   // 假设最大库存为1个,工厂停工,仓库满了		
	}
}

// 销售产品
void funC()
{
	while (true){
		std::unique_lock  lock(lock_mutex);

		if (!ready) {
			c_var.wait(lock);  // 等待产品生产完毕
		}

		// 产品卖出去了
		std::cout << "卖出了产品,库存为:" << --value << std::endl;

		// 通知工厂赶紧生产,库存为空啦
		ready = false;
		c_var.notify_all();

	}
}

4、主函数,分别开启生产线程和消费线程等2个线程

// 主函数
int main(int argc, char *argv[])
{
	std::thread fun_b_thread(funB);
	std::thread fun_c_thread(funC);

	fun_b_thread.join();
	fun_c_thread.join();

	return 0;
}

完整代码过程

#include 
#include 
#include 
#include 

static int value  = 0;			// 产品数量
static bool ready = false;		// 产品准备好标志
std::mutex lock_mutex;			// 线程互斥量 
std::condition_variable c_var;  // 条件变量

// 工厂生产产品
void funB()
{
	while (true){
		std::unique_lock  lock(lock_mutex);

		// 生产产品过程
		std::cout << "生产了产品,库存为:" << ++value << std::endl;

		// 产品生产完毕
		ready = true;
		c_var.notify_all(); // 通知销售部可以卖产品了
		c_var.wait(lock);   // 假设最大库存为1个,工厂停工,仓库满了		
	}
}

// 销售产品
void funC()
{
	while (true){
		std::unique_lock  lock(lock_mutex);

		if (!ready) {
			c_var.wait(lock);  // 等待产品生产完毕
		}

		// 产品卖出去了
		std::cout << "卖出了产品,库存为:" << --value << std::endl;

		// 通知工厂赶紧生产,库存为空啦
		ready = false;
		c_var.notify_all();

	}
}

// 主函数
int main(int argc, char *argv[])
{
	std::thread fun_b_thread(funB);
	std::thread fun_c_thread(funC);

	fun_b_thread.join();
	fun_c_thread.join();

	return 0;
}

调试结果

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836385.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号