套路化编程:C++ 创建线程并等待结果

本文介绍了在C++中如何使用Promise和Future进行异步任务处理,避免顺序执行时任务无限期阻塞。通过设置超时时间和循环检查future状态,实现对耗时任务的限时控制,当任务超时时,通过POSIX线程库强制结束线程。
摘要由CSDN通过智能技术生成

专栏介绍与文章目录-CSDN博客

        有些时候我们要执行的任务耗时不仅不可预期甚至可能永远执行不完,比如执行用用户输入的一条指令,在Linux上ping就是永远执行不完的。如果我们的设计是顺序执行,必须等待执行完毕才能继续下一个流程,那么程序就卡死在这里了。

        这当然不能接受,那么我们就需要一个限制任务执行时间的机制。当然我们可以设计一个复杂的并行处理机制,不过在不改变程序框架的情况下如何做呢?

目录

代码

知识点

promise和future

循环等待

强制结束线程


代码

        我们可以用一个线程来执行任务,同时等待任务结束,如果超过时间限制就强制终止线程的执行。

        代码如下:

#include <future>
#include <pthread.h>


bool fun(a,b,c)
{
    this->
    //这是要执行的任务,有参数a、b、c需要传递
}

//成员变量
int m_overtime=30;//超时设置

====================================================
//以下代码可以位于类中的任何一个函数
		promise<bool> p;
		auto future = p.get_future();

		thread* process_thread = new thread([&p, this, a, b, c]//因为里面用到所在类的成员变量,也需要捕获this
			{
				p.set_value(fun(a,b,c));
			});
		
		bool ret;
		time_t t1 = time(NULL);
		while (true)
		{
			if (time(NULL) - t1 < m_overtime)
			{
				auto status = future.wait_for(chrono::milliseconds(1));
				if (status == std::future_status::ready)
				{
					ret = future.get();
					break;
				}
			}
			else
			{
				thelog << "处理超时" << ende;
				pthread_cancel(process_thread->native_handle());//终止线程(C++11并没有提供可用方法)
				break;
			}
		}
		process_thread->join();

知识点

promise和future

        promise代表线程间交互的对象,可以在一个线程中设置,另一个线程中获取,future与promise对象关联,可以等待promise对象。

循环等待

        程序中循环等待future准备好,也就是fun函数运行结束,如果超时就强制结束线程。

        我这里用的是一秒钟一次的等待,看起来在future.wait_for()这里直接用超时设置就可以了,不用循环,其实是预留在这里检查别的东西,比如检查退出标志,以便立即结束任务。

强制结束线程

        C++并没有强制结束线程的方法,所以只能用posix线程库的功能来实现。

        线程被强制结束后仍然需要join。

(这里是结束)

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值