C++11线程库 (七) 线程的停止

您所在的位置:网站首页 线程退出的原因有哪些 C++11线程库 (七) 线程的停止

C++11线程库 (七) 线程的停止

2024-01-21 23:04| 来源: 网络整理| 查看: 265

在这篇文章里,我们将会讨论如何在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 std::cout // Create a std::promise object std::promise exitSignal; //Fetch std::future object associated with promise std::future futureObj = exitSignal.get_future(); // Starting Thread & move the future object in lambda function by reference std::thread th(&threadFunction, std::move(futureObj)); //Wait for 10 sec std::this_thread::sleep_for(std::chrono::seconds(10)); std::cout } Stoppable(Stoppable && obj) : exitSignal(std::move(obj.exitSignal)), futureObj(std::move(obj.futureObj)) { std::cout run(); } //Checks if thread is requested to stop bool stopRequested() { // checks if value in future object is available if (futureObj.wait_for(std::chrono::milliseconds(0)) == std::future_status::timeout) return false; return true; } // Request the thread to stop by setting value in promise object void stop() { exitSignal.set_value(); } };

这样一来,创建一个可停止的任务只需要继承这个类并重写run方法即可:

/* * A Task class that extends the Stoppable Task */ class MyTask: public Stoppable { public: // Function to be executed by thread function void run() { std::cout task.run(); }); std::this_thread::sleep_for(std::chrono::seconds(10)); std::cout } Stoppable(Stoppable && obj) : exitSignal(std::move(obj.exitSignal)), futureObj(std::move(obj.futureObj)) { std::cout run(); } //Checks if thread is requested to stop bool stopRequested() { // checks if value in future object is available if (futureObj.wait_for(std::chrono::milliseconds(0)) == std::future_status::timeout) return false; return true; } // Request the thread to stop by setting value in promise object void stop() { exitSignal.set_value(); } }; /* * A Task class that extends the Stoppable Task */ class MyTask: public Stoppable { public: // Function to be executed by thread function void run() { std::cout // Creating our Task MyTask task; //Creating a thread to execute our task std::thread th([&]() { task.run(); }); std::this_thread::sleep_for(std::chrono::seconds(10)); std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3