[C++11 并发编程] 02 - join

本文介绍了在C++11中如何使用join等待线程完成,强调了在异常环境下正确等待线程的重要性,以避免资源泄露和程序异常终止。
摘要由CSDN通过智能技术生成

1. 等待线程完成

若不等待线程完成,我们就需要确保该线程访问的数据都是有效的,直到该线程完成为止。比如如下代码,线程函数持有局部变量的指针或引用,当函数退出时,线程尚未执行完成。

#include <thread>
#include <iostream>


// 线程持有局部变量的指针
struct func
{
	int *i;
	func(int *i_) : i(i_){
	
	}

	void operator()()
	{
		for (unsigned j = 0; j < 100000; ++j)
		{
			*i = j; // 访问非法地址
		}
	}
};

// 不等待线程执行完成就退出
void oops()
{
	int some_local_state = 0;
	func my_func(&some_local_state);
	std::thread my_thread(my_func);
	my_thread.detach();
}

int _tmain(int argc, _TCHAR* argv[])
{
	oops();

	return 0;
}

要避免这种情况,需要使用std::thread实例的join()来替换my_thread.detach()的调用,这样就可以保证在函数退出前,线程已经结束。对一个给定的线程,只能调用一次join(),一旦调用了join(),此std::thread对象不再是可连接的,如果调用其的joinable()将返回false。

2. 在异常环境下的等待

我们需要在线程对象被销毁前调用join或detach方法,如果要detach,通常在线程启动后就立即调用detach方法。如果打算等待该线程,就

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值