一、启动线程
void do_something(); std::thread t(do_something);
注意t是创建的线程,do_something是函数对象,不要传入函数。提供的函数对象会复制到新线程的存储空间当中,函数对象的执行和调用都在线程的内存空间中进行。
join(),detach()
二、线程传参
线程调用传参
void f(int i,std::string const& s); std::thread t(f,3,"hello");
注意线程初始化不会对舛讹的参数隐式转换,需要显式转换。
三、转移线程所有权
std::move()来转移线程所有权,转移后源线程将和执行线程没有关联。
void some_function(); void some_other_function(); std::thread t1(some_function); // 1 std::thread t2=std::move(t1); // 2 t1=std::thread(some_other_function); // 3 std::thread t3; // 4 t3=std::move(t2); // 5 t1=std::move(t3); // 6 赋值操作将使程序崩溃,T1已经有一个线程了。
四、运行时决定线程数量
std::thread::hardware_concurrency()这个函数将返回能同时并发在一个程序中的线程数量。例如,多核系统中,返回值可以是CPU核芯的数量。因为上下文频繁的切换会降低线程的性能,所以肯定不想启动的线程数多于硬件支持的线程数量。