ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

std::get<C++11多线程库~线程管理>(08):转移线程所有权(1)

2021-10-01 11:02:06  阅读:157  来源: 互联网

标签:std 移动 thread get 对象 08 线程 所有权


 

 1 #include <QCoreApplication>
 2 #include <thread>
 3 #include <iostream>
 4 
 5 /*
 6  * 话题1:转移线程的所有权。
 7  *       std::thread 构造函数需传入一个函数或可调用对象, 每一个 std::thread 都关联着一个函数或可调用对象。
 8  *    两者之间的关联性,在不同 std::thread 对象之间是可以发生转移的。
 9  *      比如:函数 fun()本来与 std::thread A 关联着,我们可以通过转移线程的所有权,
10  *    将 func() 与 std::thread B 关联。所有权的转移,即便是 线程A 中 func()还未执行结束,也可以发生所有权转移。
11  *      线程的所有权之所以能够转移,得益于 std::thread 对移动的支持。C++标准库中有很多资源占有类型(resource-owning),
12  *    比如:std::ifstream, std::unique_ptr, std::thread都是可移动不可拷贝的。
13  *
14  *
15  * 小条儿1:临时对象作为返回值,或者临时对象拿去赋值给别的对象, 这两种情况下, 如果临时对象可移动, 移动操作将会隐式的发生。
16  * 小条儿2:命名对象作为返回值,如果命名对象可移动,则移动操作会隐式的发生; 命名对象拿去赋值给别的对象,通过 std::move 可显示的发生移动操作。
17  * 小条儿3:std::terminate() 是 noexcept函数,终止程序且不会抛出异常。重点关注不会抛出异常。
18 */
19 
20 void hello(){
21     for (int i = 10; i>0; --i)
22         std::cout<<"hello word "<<i<<std::endl;
23 }
24 
25 int main(int argc, char *argv[])
26 {
27     QCoreApplication a(argc, argv);
28 
29     std::thread t1(hello);           //t1 与 hello() 关联
30     std::thread t2(std::move(t1));   //t1所属的线程所有权转移给了t2
31     if (t1.joinable()){
32         std::cout<<"t1.joinable()"<<std::endl;
33     }
34     if (t2.joinable()){
35         std::cout<<"t2.joinable()"<<std::endl;
36     }
37 
38 
39     std::thread t11(hello);
40     //t2 = std::move(t11);      //运行崩溃:t2拥有一个线程的所有权,并且还未执行结束。
41                                 //一个 std::thread 同一时间只能拥有一个线程资源。
42                                 //再次把其他 std::thread 所有权转移给 t2之前,可以
43                                 //先执行 t2.join(), 等待 t2 的线程执行结束后,再接收别的所有权。
44 
45     t2.join();
46     t11.join();
47     return a.exec();
48 }

 

标签:std,移动,thread,get,对象,08,线程,所有权
来源: https://www.cnblogs.com/azbane/p/15358944.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有