zoukankan      html  css  js  c++  java
  • 【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++并发编程实战》

  • 相关阅读:
    常见的web漏洞
    WEB前端性能优化常见方法
    前端多终端浏览器兼容
    vue中computer与watch区别
    Vue父子组件生命周期执行顺序
    Git配置文件的妙用
    Git的基本概念和操作
    对AUC计算公式和几何意义的理解(详细版)
    如何看文献
    Python函数 range()和arange()的区分
  • 原文地址:https://www.cnblogs.com/chen-cs/p/13056715.html
Copyright © 2011-2022 走看看