并发编程(2)线程管理

一、启动线程

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核芯的数量。因为上下文频繁的切换会降低线程的性能,所以肯定不想启动的线程数多于硬件支持的线程数量。

猜你喜欢

转载自www.cnblogs.com/huangfuyuan/p/9126295.html