std::thread是C++11线程库提供的线程创建。参数绑定的是线程需要调用的函数与参数。
1、如何创建
std::thread th;//空的,
std::thread th1([]() {
//匿名函数,
//执行线程代码
});
void thFun(int k);
std::thread th(thFun,10);// thFun为线程需要调用的函数,10为thFun函数的参数。
2、线程的调用方式
join();//会阻塞当前代码,等待线程完成退出后,才会继续向下执行;
detach();
当前代码继续向下执行,创建的新线程同时并发执行,这时候需要特别注意:创建的新线程对当前作用域的变量的使用,创建新线程的作用域结束后,有可能线程仍然在执行,这时局部变量随着作用域的完成都已销毁,如果线程继续使用局部变量的引用或者指针,会出现意想不到的错误,并且这种错误很难排查
注意:一定在线程销毁前调用线程的调用方式。如果不使用,会异常。
使用detach分离调用的时候一定注意参数,因为存在作用域问题,不要使用当前作用域的数据传参。
例子:
#include <iostream>
#include"dongtest.h"
#include <thread>
#include <chrono>
using namespace std;
void thFun(int k)
{
for (int i=0;i<k;i++)
{
cout << i<<endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
int main()
{
std::thread th1([]() {
//匿名函数,
//执行线程代码
});
std::thread th(thFun,10);
th.detach();
//th.join();
cout << "detach" << endl;
while (1);
return 0;
}