在这篇文章里,我们将会讨论如何在C++11下停止和终止一个线程。
为什么C++11不直接提供一个停止线程的方法?这是因为线程在停止之前可能有一些资源需要被释放、关闭,比如说:
- 线程中已经获取锁的所有权,突然退出谁将会负责这个锁所有权释放?
- 如果线程打开了一写文件流,谁将会回收这个文件资源?
- 如果线程中有动态内存分配,内存泄露如何避免?
简单来说就是线程退出时可能有资源需要回收,而C++11无法知晓用户具体使用了哪些资源。虽然如此,但是我们仍可以通过简单的方式实现线程退出:即定时检查或者程序中某个节点检查,检查的内容是是否退出,处理方式是释放所有的资源优雅退出。
一、使用std::future停止一个线程我们可以向线程传递一个std::future
对象,为什么是传递一个空值,这是因为我们只是想要信号而不是真正的想要获取值。
首先创建一个值为void的promise对象:
std::promise exitSignal;
现在我们可以在主线程中绑定promise和future:
std::future futureObj=exitSignal.get_future();
然后在主函数中创建线程并往线程传递future对象:
std::thread th(&threadFunction,std::move(futureObj));
在线程的内部,除了完成一些线程工作外,还持续检查线程是否需要退出(在这里的条件就是future对象值是否可用)
void threadFunction(std::future futureObj)
{
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?