c++11中关于std::thread的join的详解
std::thread
是c++11新引入的线程标准库,通过其可以方便的编写与平台无关的多线程程序,虽然对比针对平台来定制化多线程库会使性能达到最大,但是会丧失了可移植性,这样对比其他的高级语言,可谓是一个不足。终于在c++11承认多线程的标准,可谓可喜可贺!!!
在使用std::thread
的时候,对创建的线程有两种操作:等待/分离,也就是join/detach
操作。join()
操作是在std::thread t(func)
后“某个”合适的地方调用,其作用是回收对应创建的线程的资源,避免造成资源的泄露。detach()
操作是在std::thread t(func)
后马上调用,用于把被创建的线程与做创建动作的线程分离,分离的线程变为后台线程,其后,创建的线程的“死活”就与其做创建动作的线程无关,它的资源会被init
进程回收。
在这里主要对join
做深入的理解。
由于join
是等待被创建线程的结束,并回收它的资源。因此,join的调用位置就比较关键。比如,以下的调用位置都是错误的。
void test() { } bool do_other_things() { } int main() { std::thread t(test); int ret = do_other_things(); if(ret == ERROR) { return -1; } t.join(); return 0; }
很明显,如果do_other_things()
函数调用返ERROR, 那么就会直接退出main函数
,此时join就不会被调用,所以线程t的资源没有被回收,造成了资源泄露。
例子二:
void test() { } bool do_other_things() { } int main() { std::thread t(test); try { do_other_things(); } catch(...) { throw; } t.join(); return 0; }
这个例子和例子一差不多,如果调用do_other_things()
函数抛出异常,那么就会直接终止程序,join
也不会被调用,造成了资源没被回收。
那么直接在异常捕捉catch
代码块里调用join
就ok啦。
例子三:
void test() { } bool do_other_things() { } int main() { std::thread t(test); try { do_other_things(); } catch(...) { t.join(); throw; } t.join(); return 0; }
是不是很多人这样操作?这样做不是万无一失的, try/catch
块只能够捕捉轻量级的异常错误,在这里如果在调用do_other_things()
时发生严重的异常错误,那么catch
不会被触发捕捉异常,同时造成程序直接从函数调用栈回溯返回,也不会调用到join
,也会造成线程资源没被回收,资源泄露。
所以在这里有一个方法是使用创建局部对象,利用函数调用栈的特性,确保对象被销毁时触发析构函数的方法来确保在主线程结束前调用join()
,等待回收创建的线程的资源。
class mythread { private: std::thread &m_t; public: explicit mythread(std::thread &t):m_t(t){} ~mythread() { if(t.joinable()) { t.join() } } mythread(mythread const&) = delete; mythread& operate=(mythread const&) = delete; } void test() { } bool do_other_things() { } int main() { std::thread t(test); mythread q(t); if(do_other_things()) { return -1; } return 0; }
在上面的例子中,无论在调用do_other_things()
是发生错误,造成return main
函数,还是产生异常,由于函数调用栈的关系,总会回溯的调用局部对象q的析构函数,同时在q的析构函数里面先判断j.joinable()
是因为join
操作对于同一个线程只能调用一次,不然会出现错误的。这样,就可以确保线程一定会在主函数结束前被等待回收了。
以上所述是小编给大家介绍的c++11中关于std::thread的join详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
上一篇:C语言实现学生信息管理程序
栏 目:C语言
本文标题:c++11中关于std::thread的join的详解
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/381.html
您可能感兴趣的文章
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言没有round函数 round c语言
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 01-10深入理解C++中常见的关键字含义
- 01-10深入Main函数中的参数argc,argv的使用详解
- 01-10APUE笔记之:进程环境详解
- 01-10c++中inline的用法分析
- 01-10如何寻找数组中的第二大数
- 01-10C++大数模板(推荐)
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 04-02jquery与jsp,用jquery
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法实例总结
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10SublimeText编译C开发环境设置