[20160216] 自带中断点的线程模型
2016-02-16 23:56
225 查看
由于std::thread无法在运行时被其他线程强制结束, 鉴于业务需要,不得不拐弯抹角换一种新方式来实现。于是今天写了点关于这个的代码
(然而仍然存在一些问题)
procx类就是一个线程管理的类。
如果一个线程函数希望能够被cancel,那么这个方法在编写时需要使用如下的宏定义
一个比较正规的写法如下
如果整个代码能够工作,那么使用方法应该是这样的
然而目前还是无法通过编译,看来通过C++模板方式支持函数参数转发,变长参数这些知识我还是掌握的不太好。继续努力!
(然而仍然存在一些问题)
class procx /** HC TECH : MutableThread Version 0.1 ( build 1 , 20160216 )*/ { public: procx(auto a) { func=a; cancel=false; done=false; status_code=0; s=nullptr; } ~procx() { delete s; } template <typename ... ARG> void start(ARG ... arg) { s=new std::thread(func,arg...); } void join() { if(s!=nullptr&&s->joinable()) { s->join(); } } void detach() { if(s!=nullptr&&s->joinable()) { s->detach(); } } bool isdone() { return done; } bool iscanceled() { return cancel; } int getcancelcode() { return status_code; } /// return: true : Thread is canceled. false: Thread is over. else will be blocked. bool trycancel() { cancel=true; join(); return done; } private: void* func; std::thread* s; bool cancel; bool done; int status_code; };
procx类就是一个线程管理的类。
如果一个线程函数希望能够被cancel,那么这个方法在编写时需要使用如下的宏定义
#define DECLX bool* doneflag,bool* cancelflag,int* _hc_status_code #define SETUNDONE *doneflag=false; #define SETDONE *doneflag=true; #define CANCELPOINT(x) if(*cancelflag){*_hc_status_code=x;return;}
一个比较正规的写法如下
void proc_a(DECLX,int* ret) { SETUNDONE CANCELPOINT(1); SETDONE }
如果整个代码能够工作,那么使用方法应该是这样的
int main() { int ret=0; procx s(proc_a,&ret); /// Start Job "s" s.start(); /// Try to cancel Job "s" s.trycancel(); }
然而目前还是无法通过编译,看来通过C++模板方式支持函数参数转发,变长参数这些知识我还是掌握的不太好。继续努力!
相关文章推荐
- AVR121-使用过采样增加ADC精度
- ASP.NET 身份验证机制
- 个人作品- 几何战争
- Rational Rose Enterprise Edition安装使用
- resharper10.0.2注册机安装
- Android开发之Service
- 转: Rest简介及Spring实现
- HDOJ 1005 Number Sequence
- 原型链进阶
- UICollectionView添加Header Footer没被调用
- 关于字符串的几个常见问题
- 资源打包
- 全排列的递归实现(java代码)
- 使用CSDN-markdown编辑器
- VTK/Tutorials/New Pipeline文档翻译
- Equals和==的比较
- 【每周一文】Factorization Machines
- eclipse里怎么用命令行输入args
- 使用SwipeRefreshLayout实现下拉刷新与上拉加载更多
- 《程序设计与算法》专项课程中止学习