在C++11之前,C++多线程需要依赖系统或者第三方接口实现,一定程度影响了代码的移植性。C++11中,引入了boost库中的多线程部分内容,形成标准。这时候boost多线程编程接口部分接口基本没有变化,方便了之前使用boost接口开发的使用者,也容易把boost接口升级为C++接口。

以下是thread类的使用过程说明:

1、先创建两个函数显示调用显示。

#include <iostream>
#include <thread>
#include "string"
using namespace std;

void threadfun1()
{
	cout << "threadfun1 start \r\n";
	this_thread::sleep_for(chrono::seconds(1));
	cout << "threadfun1 end \r\n";
}

void threadfun2(int iParam, string sParam)
{
	string paramIn;
	paramIn = to_string(iParam) + sParam;
	cout << "threadfun2 start " << paramIn << endl;
	this_thread::sleep_for(chrono::seconds(5));
	cout << "threadfun2 end\r\n";
}

2、开始正式使用thread类,创建一个thread对象即新起一个线程。

2.1 创建一个对象然后马上结束,看会发生什么情况。

主线程在析构释放资源时发生异常,因为在析构时,threadfun1仍在运行。

可以看到,主线程弹出异常错误。此时子线程仍然在继续执行。

2.2 如果想不管起来的线程,可以用detach()方法。这时如果主线程退出了,会强行释放掉运行起来的线程。

可以看到,调用detach()方法后,子线程被中断了,没有继续输出end,主线程也没有发生错误。

如果我们在子线程执行完后调用detach()方法呢?,也是可以正常结束的

2.3 如果想等待threadfun1执行完成,可以用join()方法

可以看到,程序执行了join()方法,会在此等待threadfun1执行完成。达到同步的效果。

2.4 如果join()和detach()方法一起使用呢?会出现什么情况?

在子线程已经执行完成的情况下,调用detach()会出现异常,提示子线程已经结束了。

在已经detach()的情况下去调用join(),也会出现异常。

总结:

1、新建一个thread对象即新起一个线程。

2、如果主线程起来后不管子线程状态,可以调用detach()方法,这样主线程不会出错。

3、如果主线程需要等待子线程结束,可以用join()方法,主线程会在join()方法处等待子线程结束。

4、一个线程对象不应同时调用join和detach方法,会出现异常。

 

以下是两个线程同时调用的情况,可以验证我们总结的情况。

 

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐