BOOST 线程完全攻略 - 扩展 - 可被关闭的线程类
- // janitor.hpp : 安全执行类库
- //
- #pragma once
- #include <list>
- template <class T>
- class RefHolder
- {
- T& ref_;
- public:
- RefHolder(T& ref) : ref_(ref) {}
- operator T& () const
- {
- return ref_;
- }
- private:
- // Disable assignment - not implemented
- RefHolder& operator=(const RefHolder&);
- };
- template <class T>
- inline RefHolder<T> ByRef(T& t)
- {
- return RefHolder<T>(t);
- }
- class ScopeGuardImplBase
- {
- ScopeGuardImplBase& operator =(const ScopeGuardImplBase&);
- protected:
- ~ScopeGuardImplBase()
- {
- }
- ScopeGuardImplBase(const ScopeGuardImplBase& other) throw()
- : dismissed_(other.dismissed_)
- {
- other.Dismiss();
- }
- template <typename J>
- static void SafeExecute(J& j) throw()
- {
- if (!j.dismissed_)
- try
- {
- j.Execute();
- }
- catch(...)
- {
- }
- }
- mutable bool dismissed_;
- public:
- ScopeGuardImplBase() throw() : dismissed_(false)
- {
- }
- void Dismiss() const throw()
- {
- dismissed_ = true;
- }
- };
- typedef const ScopeGuardImplBase& ScopeGuard;
- template <typename F>
- class ScopeGuardImpl0 : public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl0<F> MakeGuard(F fun)
- {
- return ScopeGuardImpl0<F>(fun);
- }
- ~ScopeGuardImpl0() throw()
- {
- SafeExecute(*this);
- }
- void Execute()
- {
- fun_();
- }
- protected:
- ScopeGuardImpl0(F fun) : fun_(fun)
- {
- }
- F fun_;
- };
- template <typename F>
- inline ScopeGuardImpl0<F> MakeGuard(F fun)
- {
- return ScopeGuardImpl0<F>::MakeGuard(fun);
- }
- template <typename F, typename P1>
- class ScopeGuardImpl1 : public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
- {
- return ScopeGuardImpl1<F, P1>(fun, p1);
- }
- ~ScopeGuardImpl1() throw()
- {
- SafeExecute(*this);
- }
- void Execute()
- {
- fun_(p1_);
- }
- protected:
- ScopeGuardImpl1(F fun, P1 p1) : fun_(fun), p1_(p1)
- {
- }
- F fun_;
- const P1 p1_;
- };
- template <typename F, typename P1>
- inline ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
- {
- return ScopeGuardImpl1<F, P1>::MakeGuard(fun, p1);
- }
- template <typename F, typename P1, typename P2>
- class ScopeGuardImpl2: public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2)
- {
- return ScopeGuardImpl2<F, P1, P2>(fun, p1, p2);
- }
- ~ScopeGuardImpl2() throw()
- {
- SafeExecute(*this);
- }
- void Execute()
- {
- fun_(p1_, p2_);
- }
- protected:
- ScopeGuardImpl2(F fun, P1 p1, P2 p2) : fun_(fun), p1_(p1), p2_(p2)
- {
- }
- F fun_;
- const P1 p1_;
- const P2 p2_;
- };
- template <typename F, typename P1, typename P2>
- inline ScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2)
- {
- return ScopeGuardImpl2<F, P1, P2>::MakeGuard(fun, p1, p2);
- }
- template <typename F, typename P1, typename P2, typename P3>
- class ScopeGuardImpl3 : public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl3<F, P1, P2, P3> MakeGuard(F fun, P1 p1, P2 p2, P3 p3)
- {
- return ScopeGuardImpl3<F, P1, P2, P3>(fun, p1, p2, p3);
- }
- ~ScopeGuardImpl3() throw()
- {
- SafeExecute(*this);
- }
- void Execute()
- {
- fun_(p1_, p2_, p3_);
- }
- protected:
- ScopeGuardImpl3(F fun, P1 p1, P2 p2, P3 p3) : fun_(fun), p1_(p1), p2_(p2), p3_(p3)
- {
- }
- F fun_;
- const P1 p1_;
- const P2 p2_;
- const P3 p3_;
- };
- template <typename F, typename P1, typename P2, typename P3>
- inline ScopeGuardImpl3<F, P1, P2, P3> MakeGuard(F fun, P1 p1, P2 p2, P3 p3)
- {
- return ScopeGuardImpl3<F, P1, P2, P3>::MakeGuard(fun, p1, p2, p3);
- }
- //************************************************************
- template <class Obj, typename MemFun>
- class ObjScopeGuardImpl0 : public ScopeGuardImplBase
- {
- public:
- static ObjScopeGuardImpl0<Obj, MemFun> MakeObjGuard(Obj& obj, MemFun memFun)
- {
- return ObjScopeGuardImpl0<Obj, MemFun>(obj, memFun);
- }
- ~ObjScopeGuardImpl0() throw()
- {
- SafeExecute(*this);
- }
- void Execute()
- {
- (obj_.*memFun_)();
- }
- protected:
- ObjScopeGuardImpl0(Obj& obj, MemFun memFun)
- : obj_(obj), memFun_(memFun) {}
- Obj& obj_;
- MemFun memFun_;
- };
- template <class Obj, typename MemFun>
- inline ObjScopeGuardImpl0<Obj, MemFun> MakeObjGuard(Obj& obj, MemFun memFun)
- {
- return ObjScopeGuardImpl0<Obj, MemFun>::MakeObjGuard(obj, memFun);
- }
- template <class Obj, typename MemFun, typename P1>
- class ObjScopeGuardImpl1 : public ScopeGuardImplBase
- {
- public:
- static ObjScopeGuardImpl1<Obj, MemFun, P1> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1)
- {
- return ObjScopeGuardImpl1<Obj, MemFun, P1>(obj, memFun, p1);
- }
- ~ObjScopeGuardImpl1() throw()
- {
- SafeExecute(*this);
- }
- void Execute()
- {
- (obj_.*memFun_)(p1_);
- }
- protected:
- ObjScopeGuardImpl1(Obj& obj, MemFun memFun, P1 p1)
- : obj_(obj), memFun_(memFun), p1_(p1) {}
- Obj& obj_;
- MemFun memFun_;
- const P1 p1_;
- };
- template <class Obj, typename MemFun, typename P1>
- inline ObjScopeGuardImpl1<Obj, MemFun, P1> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1)
- {
- return ObjScopeGuardImpl1<Obj, MemFun, P1>::MakeObjGuard(obj, memFun, p1);
- }
- template <class Obj, typename MemFun, typename P1, typename P2>
- class ObjScopeGuardImpl2 : public ScopeGuardImplBase
- {
- public:
- static ObjScopeGuardImpl2<Obj, MemFun, P1, P2> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2)
- {
- return ObjScopeGuardImpl2<Obj, MemFun, P1, P2>(obj, memFun, p1, p2);
- }
- ~ObjScopeGuardImpl2() throw()
- {
- SafeExecute(*this);
- }
- void Execute()
- {
- (obj_.*memFun_)(p1_, p2_);
- }
- protected:
- ObjScopeGuardImpl2(Obj& obj, MemFun memFun, P1 p1, P2 p2)
- : obj_(obj), memFun_(memFun), p1_(p1), p2_(p2) {}
- Obj& obj_;
- MemFun memFun_;
- const P1 p1_;
- const P2 p2_;
- };
- template <class Obj, typename MemFun, typename P1, typename P2>
- inline ObjScopeGuardImpl2<Obj, MemFun, P1, P2> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2)
- {
- return ObjScopeGuardImpl2<Obj, MemFun, P1, P2>::MakeObjGuard(obj, memFun, p1, p2);
- }
- #define CONCATENATE_DIRECT(s1, s2) s1##s2
- #define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2)
- #define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__)
- #define ON_BLOCK_EXIT ScopeGuard ANONYMOUS_VARIABLE(scopeGuard) = MakeGuard
- #define ON_BLOCK_EXIT_OBJ ScopeGuard ANONYMOUS_VARIABLE(scopeGuard) = MakeObjGuard
- //////////////////////////////////////////////////////////////////////////////////////////
- // janitor
- struct ICmd_
- {
- virtual void Dismiss() const throw() = 0;
- virtual ~ICmd_() throw() {}
- };
- template<typename T>
- class CmdAdaptor : public ICmd_, protected T
- {
- public:
- template<typename Fun>
- CmdAdaptor(Fun fun) : T(fun) {}
- template<typename Fun, typename P1>
- CmdAdaptor(Fun fun, P1 p1) : T(fun, p1) {}
- template<typename Fun, typename P1, typename P2>
- CmdAdaptor(Fun fun, P1 p1, P2 p2) : T(fun, p1, p2) {}
- template<typename Fun, typename P1, typename P2, typename P3>
- CmdAdaptor(Fun fun, P1 p1, P2 p2, P3 p3) : T(fun, p1, p2, p3) {}
- void Dismiss() const throw()
- {
- T::Dismiss();
- }
- };
- class Janitor
- {
- public:
- Janitor() throw() {}
- template <typename F>
- Janitor(F pFun) : spCmd_(
- new CmdAdaptor<ScopeGuardImpl0<F> >(pFun)) {}
- template <typename F, typename P1>
- Janitor(F pFun, P1 p1) : spCmd_(
- new CmdAdaptor<ScopeGuardImpl1<F, P1> >(pFun, p1)) {}
- template <typename F, typename P1, typename P2>
- Janitor(F pFun, P1 p1, P2 p2) : spCmd_(
- new CmdAdaptor<ScopeGuardImpl2<F, P1, P2> >(pFun, p1, p2)) {}
- template <typename F, typename P1, typename P2, typename P3>
- Janitor(F pFun, P1 p1, P2 p2, P3 p3) : spCmd_(
- new CmdAdaptor<ScopeGuardImpl3<F, P1, P2, P3> >(pFun, p1, p2, p3)) {}
- Janitor(const Janitor& other) throw() : spCmd_(other.spCmd_) {} //VC++, Comeau need it!
- Janitor& operator =(const Janitor& other) throw()
- {
- if (spCmd_.get())
- spCmd_->Dismiss();
- spCmd_ = other.spCmd_;
- return *this;
- }
- void Dismiss() const throw()
- {
- spCmd_->Dismiss();
- }
- protected:
- mutable std::auto_ptr<ICmd_> spCmd_;
- };
- template<typename T>
- class ObjCmdAdaptor : public ICmd_, protected T
- {
- public:
- template<typename Obj, typename MemFun>
- ObjCmdAdaptor(Obj& obj, MemFun memFun) : T(obj, memFun) {}
- template<typename Obj, typename MemFun, typename P1>
- ObjCmdAdaptor(Obj& obj, MemFun memFun, P1 p1) : T(obj, memFun, p1) {}
- template<typename Obj, typename MemFun, typename P1, typename P2>
- ObjCmdAdaptor(Obj& obj, MemFun memFun, P1 p1, P2 p2) : T(obj, memFun, p1, p2) {}
- void Dismiss() const throw()
- {
- T::Dismiss();
- }
- };
- class ObjJanitor : protected Janitor
- {
- public:
- using Janitor::Dismiss;
- ObjJanitor() throw() {}
- template <typename Obj, typename MemFun>
- ObjJanitor(Obj& obj, MemFun memFun)
- {
- std::auto_ptr<ICmd_> spTmp(
- new ObjCmdAdaptor<ObjScopeGuardImpl0<Obj, MemFun> >(obj, memFun));
- spCmd_ = spTmp;
- }
- template <typename Obj, typename MemFun, typename P1>
- ObjJanitor(Obj& obj, MemFun memFun, P1 p1)
- {
- std::auto_ptr<ICmd_> spTmp(
- new ObjCmdAdaptor<ObjScopeGuardImpl1<Obj, MemFun, P1> >(obj, memFun, p1));
- spCmd_ = spTmp;
- }
- template <typename Obj, typename MemFun, typename P1, typename P2>
- ObjJanitor(Obj& obj, MemFun memFun, P1 p1, P2 p2)
- {
- std::auto_ptr<ICmd_> spTmp(
- new ObjCmdAdaptor<ObjScopeGuardImpl2<Obj, MemFun, P1, P2> >(obj, memFun, p1, p2));
- spCmd_ = spTmp;
- }
- };
使用范例
- #include "stdafx.h"
- #include <iostream>
- #include <string>
- using namespace std;
- #include "janitor.hpp"
- class class1
- {
- public:
- class1()
- {
- }
- ~class1()
- {
- }
- public:
- void test()
- {
- ObjJanitor ja(*this,&class1::testJanitor);
- }
- void testJanitor()
- {
- cout << "hello world" << endl;
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- class1 c;
- c.test();
- return 0;
- }
二.controlled_module 可被关闭的线程类
- // controlled_module.hpp : 可主动关闭的boost线程类
- //
- #pragma once
- #include <boost/utility.hpp>
- #include <boost/thread/condition.hpp>
- #include <boost/thread/mutex.hpp>
- #include <boost/thread/thread.hpp>
- #include <boost/bind.hpp>
- #include "janitor.hpp"
- class controlled_module_implement : boost::noncopyable {
- public:
- controlled_module_implement() :active_(false),command_exit_(false){}
- boost::condition module_is_exit;
- boost::mutex monitor;
- void active(bool ac)
- {boost::mutex::scoped_lock lk(monitor); if(!(active_=ac))module_is_exit.notify_all();else command_exit_=false;}
- bool command_exit(){boost::mutex::scoped_lock lk(monitor); return command_exit_;}
- bool active_,command_exit_;
- };
- class controlled_module : boost::noncopyable {
- public:
- virtual void run()
- {
- ObjJanitor janitor(*impl_,&controlled_module_implement::active,false);
- impl_->active(true);
- {
- ObjJanitor janitor(*this,&controlled_module::release);
- if(this->initialize())
- {
- m_live = true;
- SetEvent(m_event_init);
- while(!impl_->command_exit() && this->islive() && this->work())
- {
- }
- }
- else
- {
- m_live = false;
- SetEvent(m_event_init);
- }
- }
- }
- bool exit(unsigned long sec=0)
- {
- boost::mutex::scoped_lock lk(impl_->monitor);
- impl_->command_exit_ = true;
- while(impl_->active_)
- {
- if(sec)
- {
- boost::xtime xt;
- boost::xtime_get(&xt, boost::TIME_UTC);
- xt.sec += sec;
- if(!impl_->module_is_exit.timed_wait(lk,xt))
- return false;
- }
- else
- impl_->module_is_exit.wait(lk);
- }
- return true;
- }
- protected:
- controlled_module()
- :impl_(new controlled_module_implement)
- ,m_live(false)
- ,m_event_init(0)
- ,m_sleeptime(10)
- {
- }
- virtual ~controlled_module()
- {
- if(m_live)
- stop();
- delete impl_;
- }
- private:
- virtual bool initialize(){return true;}
- virtual void release(){}
- protected:
- virtual bool work()
- {
- Sleep(this->m_sleeptime);
- return true;
- }
- int m_sleeptime;
- private:
- bool m_live;
- void * m_event_init;
- controlled_module_implement* impl_;
- public:
- bool start()
- {
- m_event_init = CreateEvent(NULL,FALSE,FALSE,"");
- boost::thread thd(boost::bind(&controlled_module::run,this));
- ::WaitForSingleObject(m_event_init,INFINITE);
- CloseHandle(m_event_init);
- m_event_init = 0;
- return m_live;
- }
- void stop()
- {
- m_live = false;
- exit(1);
- }
- bool islive(){return m_live;}
- void die()
- {
- m_live = false;
- SetEvent(m_event_init);
- }
- void setsleeptime(int n)
- {
- m_sleeptime = n;
- }
- };
- //controlled_module demo
- #include "controlled_module.hpp"
- class thd: public controlled_module
- {
- public:
- virtual bool initialize()
- {
- cout << "thd init" << endl;
- return true;
- }
- virtual void release()
- {
- cout << "thd release" << endl;
- }
- virtual bool work()
- {
- //your work........
- return controlled_module::work();
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- thd t;
- t.start();
- char buf[10];
- gets_s(buf,sizeof buf);
- t.stop();
- return 0;
- }
thd线程在启动以后,将循环执行work()函数,直到线程退出
BOOST 线程完全攻略 - 扩展 - 可被关闭的线程类的更多相关文章
- BOOST 线程完全攻略 - 扩展 - 线程消息通讯
// controlled_module_ex.hpp : controlled_module类的扩展 // 增强线程之间消息通讯 // 增加线程安全启动和安全关闭功能 // 增加定时器功能 #p ...
- BOOST 线程完全攻略 - 扩展 - 事务线程
扩展threadtimermoduleexceptionsocket 什么叫事务线程 举个例子: 我们写一个IM客户端的登录子线程,则该子线程会有这么几个事务要处理 No.1 TCP Socket物理 ...
- BOOST 线程完全攻略 - 基础篇
http://blog.csdn.net/iamnieo/article/details/2908621 2008-09-10 12:48 9202人阅读 评论(3) 收藏 举报 thread多线程l ...
- BOOST 线程完全攻略
1 创建线程 首先看看boost::thread的构造函数吧,boost::thread有两个构造函数: (1)thread():构造一个表示当前执行线程的线程对象: (2)explicit thre ...
- 【C/C++】BOOST 线程完全攻略 - 基础篇
C++多线程开发是一个复杂的事情,mfc下提供了CWinThread类,和AfxBeginThread等等函数,但是在使用中会遇到很多麻烦事情,例如线程之间参数传递的问题,我们一般都是把参数new一个 ...
- BOOST 线程完全攻略 - 结束语
modulethread扩展多线程破解通讯 全文介绍了3个boost::thread的扩展类,希望能给大家书写多线程代码带来便捷. thread -> controlled_module_ex ...
- Chrome插件(扩展)开发全攻略
[干货]Chrome插件(扩展)开发全攻略:https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html
- 零基础攻略!如何使用kubectl和HPA扩展Kubernetes应用程序
现如今,Kubernetes已经完全改变了软件开发方式.Kubernetes作为一个管理容器化工作负载及服务的开源平台,其拥有可移植.可扩展的特性,并促进了声明式配置和自动化,同时它还证明了自己是管理 ...
- Linux shell 脚本攻略之根据扩展名切分文件名
摘自:<Linux shell 脚本攻略>Page61-62
随机推荐
- How to center anything with css
1. 绝对居中定位技术 我经常用margin:0 auto来实现水平居中,而一直认为margin:auto不能实现垂直居中……实际上,实现垂直居中仅需要声明元素高度和下面的CSS 优点: 缺点: 1 ...
- 在WIN7系统下用Quartus ii 11.1 NIOS II 11.1 有时候会出现Nios II 的Run as hardware 中报错:Downloading ELF Process failed
nios工程在编译通过后RUN的过程中出现Error Running Nios II Project: ‘Downloading ELF Process failed’问题原因: 1.nios2 cp ...
- js_day13
- iCIBA简单案例
效果图: 代码: <!DOCTYPE html><html> <head> <meta charset="utf-8" /> < ...
- utf-8的mysql表笔记
链接数据库指定编码集jdbc:mysql://192.168.2.33:3306/mybase?useUnicode=true&characterEncoding=UTF-8 mysql默认链 ...
- Bootstrap定制(二)less基础语法
前几日花了一天去看less,这几日在捣鼓其他东西,项目也在有序的进行中,今天花点时间整理下less的基础语法,也分享实际中的一些经验,与众人共享. 本篇笔者以less的基础语法着手,并配合bootst ...
- Python学习(一) Python安装配置
我本身是Java程序猿,听说Python很强大,所以准备学习一下Python,虽说语言都是相同的,但java跟python肯定还是有区别的.希望在此记录一下自己的学习过程. 目前,Python分2.X ...
- 了不起的分支和循环02 - 零基础入门学习Python008
了不起的分支和循环02 让编程改变世界 Change the world by program 上节课,小甲鱼教大家如何正确的打飞机,其要点就是:判断和循环,判断就是该是不该做某事,循环就是持续做某事 ...
- 解决位于底端Edittext 输入时被软盘遮盖
遇到这种情况我们首先到网上搜一圈,大概情况是需要设置<activity/> android:windowSoftInputMode="adjustResize" ,按照 ...
- CoreData学习-最好的一片文章
CoreData学习-最好的一片文章 分类: IOS重新上路2014-05-25 18:00 1937人阅读 评论(0) 收藏 举报 目录(?)[+] 写的很好的一篇教程,我什么时候能写出这么 ...