【C++多线程】转移线程所有权
C++标准库中有很多资源占有(resource-owning)类型,比如 std::ifstream , std::unique_ptr 还有 std::thread 都是可移动(movable),但不可拷贝(cpoyable)。虽然, std::thread 实例不会如 std::unique_ptr 去占有一个动态对象所有权,但是它会占用一部分资源的所有权:每个实例都管理一个执行线程。 std::thread 所有权可以在多个实例中互相转移。在同一时间点,就能保证只关联一个执行线程;同时,也允许程序员能在不同的对象之间转移所有权。
1 #include <iostream> 2 #include <thread> 3 4 using namespace std; 5 6 7 void test() 8 { 9 cout << "子线程开始" << endl; 10 cout << "子线程结束" << endl; 11 return; 12 } 13 14 15 int main() 16 { 17 cout << "主线程开始" << endl; 18 thread t1(test); //创建t1 19 thread t2 = move(t1); //将t1的所有权转给t2 20 t1 = thread(test); //临时对象thread(test)的移动操作会隐式自动执行 21 thread t3; //创建线程对象t3但是并未关联线程函数 22 t3 = move(t2); //将t12的所有权转给t3 23 t1 = move(t3); //操作会失败,因为t1已经有了关联线程 24 cout << "主线程结束!" << endl; 25 return 0; 26 }
线程的所有权可以在函数外进行转移。
所有权可以在函数内部传递,允许 std::thread 实例可作为参数进行传递。
参考
《C++并发编程实战》
菜鸟手记。