c++多线程编程 Trap 2: std::promise多次set_value引发的灾难

问题描述

学习多线程编程过程,因为编写代码不够严谨并且对std::promise与std::future的了解不够到位,造成了这次程序崩溃。

问题报错信息如下:
在这里插入图片描述
(最近老是搞崩程序啊,流泪啊。。。)

示例代码如下:

void promise_future_example()
{
	auto meaning = [](std::promise<int>& prom) {
		//first set value by promise, note: only set value once by promise
		prom.set_value(42);

		//many codes
		//...

		//error: second set value by promise
		prom.set_value(41);
	};

	std::promise<int> prom;
	std::future<int> result = prom.get_future();

	std::thread(meaning, std::ref(prom)).detach();
	
	std::cout << "the meaning of the life: " << result.get() << std::endl;
}

原因分析:

这次遇到的问题,还是因为对std::promise的了解的不到位,当然如果遇到代码量超多的情况,也可能会发生这种问题,就是在一个任务(线程)中连续调用两次或多次std::promise::set_value()函数,这是造成本次程序崩溃的根因所在。

基础很重要,细心同样重要,不然这个问题就不会发生了。。。

解决方案:

在线程函数中去除多余的std::promise::set_value()函数调用即可。
(解决方案多简单,定位问题老费劲了。。。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值