Linux_临时线程应用:CancelTempThreadAPI

CancelTempThreadAPI

一、简介

  Provide a set of API (Packaged into classes using C++) :could create and cancel the tempory thread。

  在实际工作过程中,有时需要我们对一些临时性的工作进行处理,传统的处理方式可能是:在一个工作线程中不断轮训相应时间标志,置位则执行,反之则取消。但是对于一些连贯性动作,或是在调用第三方接口时,可能无法适时终止相应执行流。为了解决以上问题,该仓库封装了一个C++类,通过调用相关对象,可以创建或是取消一个临时线程。
  GitHUb项目地址:CancelTempThreadAPI


二、快速上手

1. 依赖环境

  使用相应接口,需要包含以下头文件
	#include <CThread.h>

2.对象调用

	CThreadEvent TempThread;

3.线程创建

  用户可以调用方以下两个接口,来创建线程:

	int CThreadEvent::Start(void *pClass , CallBack FuncHandle, void * pArg);	///通过该接口在新建线程中执行常规的成员函数
	int CThreadEvent::Start(NormalFuncHandle FuncHandle, void *pArg);		///通过该接口在新建线程中执行常规函数

4.线程取消

	int CThreadEvent::Cancel();	///通过该接口以取消临时线程的执行

三、实现原理

  此套API通过创建临时线程的方式,处理用户指定执行流。根据临时线程终止原因的不同,可以分为以下几种情况:

1.执行流执行完毕,正常退出

临时线程执行流正常终止

2.其它线程主动取消临时线程

主动终止线程

  关于cancel的实现,主要存在以下两种方式:

  1. pthread_cancel()
      此种方式要求在创建临时线程时,需要设置线程的分离属性。并调用pthread_cancel()来终止线程。
  2. pthread_kill()
      此种要是要求用户在创建临时线程时,必须先为指定信号设置信号处理函数,临时线程在收到相应线程后,终止本线程执行。

注:关于线程与信号的相关知识参见《UNIX环境高级编程》

《UNIX环境高级编程》

  此外,在取消临时线程时,我们还不得不考虑资源回收的问题,具体的情境如下图所示:
主动终止线程可能导致的异常情境
  倘若我们在指定的执行流ProcessaA中申请了堆栈、互斥锁、信号量等资源,那么在临时线程被意外终止时,会导致相应的资源没有释放(即使我们在线程退出前执行了线程清理函数),从而造成内存泄漏。这也是为什么在安卓中没有实现pthread_cancel()的原因

注:该接口包含上述两种实现。通过USE_SIGNAL宏来决定具体使用何种方式

    ///1: 使用信号取消线程序 非1: 使用pthread_cancel()取消线程
    #define USE_SIGNAL 0

四、参考与链接

  1. 《UNIX环境高级编程》:https://zh.wikipedia.org/wiki/UNIX環境高級編程
  2. 设置线程的分离属性:http://www.cnblogs.com/lijunamneg/archive/2013/01/25/2877211.html
  3. android bionic缺失pthread_cancel的解决法:https://blog.csdn.net/yzx41099296/article/details/7692484
  4. CancelTempThreadAPI:https://github.com/0Litost0/CancelTempThreadAPI

五、文档信息

作者: Litost_Cheng

发表日期:2019年01月05日
更多内容:

  1. Litost_Cheng的博客
  2. Litost_Cheng的Github
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值