std::thread创建线程很简单,只需提供线程函数或函数对象,同时指定线程函数的参数。
创建线程示例:
#include <thread>
void func()
{
}
int main()
{
std::thread t(func);
t.join();
return 0;
}
join函数会阻塞主线程,直到子线程执行结束。
如果不希望主线程被阻塞,可用detach()方法,将主线程和子线程分离。
#include <thread>
void func()
{
}
int main()
{
std::thread t(func);
t.detach();
return 0;
}
子线程和主线程分离,让子线程作为后台线程运行了,detach后子线程不再受主线程控制。
线程可以接受参数:
void func(int i, double d, const std::string& s)
{
std::cout << i << ", " << d << ", " << s << std::endl;
}
int main()
{
std::thread t(func, 1, 2, "test");
t.join();
return 0;
}
输出:
1, 2, test
线程不能复制,但可以移动:
#include <thread>
void func()
{
}
int main()
{
std::thread t(func);
std::thread t1(std::move(t));
t.join();
t1.join();
return 0;
}
还可以通过std::bind或lambda表达式来创建线程:
void func(int a, double b)
{
}
int main()
{
std::thread t1(std::bind(func, 1, 2));
std::thread t2([](int a, double b){}, 1,2);
t1.join();
t2.join();
return 0;
}
需要注意线程对象的生命周期:
#include <thread>
void func()
{
}
int main()
{
std::thread t(func);
return 0;
}
上面代码可能抛出异常,如果线程对象t先于线程函数析构了,则会异常。可通过join方式阻塞或detach方式后台运行来解决。
获取线程当前信息,如线程ID,CPU数量;和线程休眠:
void f()
{
std::this_thread::sleep_for(std::chrono::seconds(3));
cout << "time out" << endl;
}
int main()
{
std::thread t(f);
t.join();
cout << t.get_id() << endl;
cout << std::thread::hardware_concurrency() << endl;
return 0;
}