两种情况:
上面中情况都涉及到新线程的所有权转移,这是移动引入std::thread的原因。在C++标准库中有很多资源占有( resource-owning) 类型, 比如 std::ifstream , std::unique_ptr 还有 std::thread , 都是可移动( movable) , 且不可拷贝( cpoyable) 的。
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 赋值操作将使程序崩溃
不能通过赋一个新值给std::thread对象方式来丢弃一个线程。
std::thread支持移动,就意味着线程的所有权,可以在函数外进行转移
std::thread f()
void some_function();
return std::thread(some_function);
std::thread g()
void some_other_function(int);
std::thread t(some_other_function,42);
return t;
同样的,当所有权可以在函数内部传递,这就允许将std::thread实例当做参数进行传递:
void f(std::thread t);
void g()
void some_function();
f(std::thread(some_function));
std::thread t(some_function);
f(std::move(t));
线程所做的工作都是独立的,并且结果仅受到共享数据的影响。
void do_work(unsigned id);
void f()
std::vector<std::thread> threads;
for(unsigned i=0; i < 20; ++i)
threads.push_back(std::thread(do_work,i)); // 产生线程