线程创建
基础版本
需要构造一个std::tread对象,传入参数为任何可调用对象。
#include <iostream>
#include <thread>
using namespace std;
void do_sth() {
cout << "start do_sth";
}
int main()
{
std::cout << "Hello World!\n";
thread t1(do_sth);
return 0;
}
构造std::tread对象后自动执行。
可调用类
#include <iostream>
#include <thread>
using namespace std;
class do_sth {
public:
void operator ()()const {
cout << "start do_sth";
}
};
int main()
{
std::cout << "Hello World!\n";
thread t1{ do_sth() };
return 0;
}
{}表示参数列表,如果单独定义一个类do_sth,作为参数传入的话,会调用拷贝构造函数。
lambada表达式
#include <iostream>
#include <thread>
using namespace std;
int main()
{
std::cout << "Hello World!\n";
thread t1([] {
cout << "start do_sth";
} );
return 0;
}
等待与否
线程启动后,需要显示决定是否等待他完成,尤其涉及通过引用或指针访问其他线程函数局部变量时候。
class func1 {
int& i;
public:
func1(int& _i) :i(_i) {}
void operator ()()const {
for (unsigned int j = 0; j < 0x7fffffff; j++) {
i++;
}
}
};
void opp() {
int i_opp = 0;
func1 my_func(i_opp);
thread my_thread(my_func);
my_thread.detach();
}
int main()
{
std::cout << "Hello World!\n";
/* thread t1([] {
cout << "start do_sth";
} );*/
opp();
return 0;
}
上例子中,使用了detach,不等待线程结束,opp函数已经结束,但是,i还在引用。
应该用join替换detach。
线程一旦分离,就不能获取到一个引用他的threa对象,所以该线程不再次被结合。
传参
函数方法直接放在函数参数中,类方法需要构造函数,lambada方法可以用传参和捕获。一定注意参数的生命周期。