C++两种线程模式:委托和继承(附示例)

简介: 继承方式实现简单,请参见:https://github.com/eyjian/mooon/blob/master/common_library/include/mooon/sys/thread.
继承方式实现简单,请参见: https://github.com/eyjian/mooon/blob/master/common_library/include/mooon/sys/thread.h

在C++11标准之前的实现较为复杂(可参见: https://github.com/eyjian/mooon/blob/master/common_library/include/mooon/sys/thread_engine.h):

委托版本使用非常简单:

点击(此处)折叠或打开

  1. static void hello(int m, int n)
  2. {
  3.     printf("[%u] hello: %d/%d\n", pthread_self(), m, n);
  4. }

  5. class X
  6. {
  7. public:
  8.     void world(int m, int n, int l)
  9.     {
  10.         printf("[%u] X::world: %d/%d/%d\n", pthread_self(), m, n, l);
  11.     }
  12. };

  13. int main()
  14. {
  15.     X* x2 = new X;

  16.     // 带2个参数
  17.     CThreadEngine engine9(bind(&hello, 2015, 5));

  18.     // 带3个参数
  19.     CThreadEngine engine16(bind(&X::world, x2, 2016, 5, 3));
  20.     return 0;
  21. }

委托版本实现:
  1. #ifndef MOOON_SYS_THREAD_ENGINE_H
  2. #define MOOON_SYS_THREAD_ENGINE_H

  3. // 如果测试,请不需注释掉TEST_THREAD_ENGINE的定义
  4. //#define TEST_THREAD_ENGINE 1

  5. #if !defined(TEST_THREAD_ENGINE)
  6. #include "mooon/sys/config.h" // 如果需要脱离mooon运行,请注释掉这行
  7. #endif // TEST_THREAD_ENGINE

  8. #include pthread.h>
  9. #include stdio.h>
  10. #include unistd.h>

  11. #if defined(TEST_THREAD_ENGINE)
  12. #define SYS_NAMESPACE_BEGIN
  13. #define SYS_NAMESPACE_END
  14. #endif // TEST_THREAD_ENGINE
  15. SYS_NAMESPACE_BEGIN

  16. // 基类
  17. class Function
  18. {
  19. public:
  20.     virtual ~Function() {}
  21.     virtual void operator ()() = 0;
  22. };

  23. ////////////////////////////////////////////////////////////////////////////////
  24. // 不带参数

  25. class FunctionWithoutParameter: public Function
  26. {
  27. public:
  28.     // 不使用返回值,所以不需要返回值,否则将void替换成需要的类型
  29.     typedef void (*FunctionPtr)();

  30.     FunctionWithoutParameter(FunctionPtr function_ptr)
  31.         : _function_ptr(function_ptr)
  32.     {
  33.     }

  34.     virtual void operator ()()
  35.     {
  36.         (*_function_ptr)();
  37.     }
  38.     
  39. private:
  40.     FunctionPtr _function_ptr;
  41. };

  42. template class ObjectType>
  43. class MemberFunctionWithoutParameter: public Function
  44. {
  45. public:
  46.     typedef void (ObjectType::*MemberFunctionPtr)();
  47.     MemberFunctionWithoutParameter(MemberFunctionPtr member_function_ptr, ObjectType* object)
  48.         : _member_function_ptr(member_function_ptr), _object(object)
  49.     {
  50.     }
  51.     
  52.     virtual void operator ()()
  53.     {
  54.         (_object->*_member_function_ptr)();
  55.     }
  56.     
  57. private:
  58.     MemberFunctionPtr _member_function_ptr;
  59.     ObjectType* _object;
  60. };

  61. ////////////////////////////////////////////////////////////////////////////////
  62. // 带1个参数

  63. template typename ParameterType>
  64. class FunctionWith1Parameter: public Function
  65. {
  66. public:
  67.     typedef void (*FunctionPtr)(ParameterType);

  68.     FunctionWith1Parameter(FunctionPtr function_ptr, ParameterType parameter)
  69.         : _function_ptr(function_ptr), _parameter(parameter)
  70.     {
  71.     }

  72.     virtual void operator ()()
  73.     {
  74.         (*_function_ptr)(_parameter);
  75.     }
  76.     
  77. private:
  78.     FunctionPtr _function_ptr;
  79.     ParameterType _parameter;
  80. };

  81. template class ObjectType, typename ParameterType>
  82. class MemberFunctionWith1Parameter: public Function
  83. {
  84. public:
  85.     typedef void (ObjectType::*MemberFunctionPtr)(ParameterType);
  86.     MemberFunctionWith1Parameter(MemberFunctionPtr member_function_ptr, ObjectType* object, ParameterType parameter)
  87.         : _member_function_ptr(member_function_ptr), _object(object), _parameter(parameter)
  88.     {
  89.     }
  90.     
  91.     virtual void operator ()()
  92.     {
  93.         (_object->*_member_function_ptr)(_parameter);
  94.     }
  95.     
  96. private:
  97.     MemberFunctionPtr _member_function_ptr;
  98.     ObjectType* _object;
  99.     ParameterType _parameter;
  100. };

  101. ////////////////////////////////////////////////////////////////////////////////
  102. // 带2个参数

  103. template typename Parameter1Type, typename Parameter2Type>
  104. class FunctionWith2Parameter: public Function
  105. {
  106. public:
  107.     typedef void (*FunctionPtr)(Parameter1Type, Parameter2Type);

  108.     FunctionWith2Parameter(FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2)
  109.         : _function_ptr(function_ptr), _parameter1(parameter1), _parameter2(parameter2)
  110.     {
  111.     }

  112.     virtual void operator ()()
  113.     {
  114.         (*_function_ptr)(_parameter1, _parameter2);
  115.     }

  116. private:
  117.     FunctionPtr _function_ptr;
  118.     Parameter1Type _parameter1;
  119.     Parameter2Type _parameter2;
  120. };

  121. template class ObjectType, typename Parameter1Type, typename Parameter2Type>
  122. class MemberFunctionWith2Parameter: public Function
  123. {
  124. public:
  125.     typedef void (ObjectType::*MemberFunctionPtr)(Parameter1Type, Parameter2Type);
  126.     MemberFunctionWith2Parameter(MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2)
  127.         : _member_function_ptr(member_function_ptr), _object(object), _parameter1(parameter1), _parameter2(parameter2)
  128.     {
  129.     }

  130.     virtual void operator ()()
  131.     {
  132.         (_object->*_member_function_ptr)(_parameter1, _parameter2);
  133.     }

  134. private:
  135.     MemberFunctionPtr _member_function_ptr;
  136.     ObjectType* _object;
  137.     Parameter1Type _parameter1;
  138.     Parameter2Type _parameter2;
  139. };

  140. ////////////////////////////////////////////////////////////////////////////////
  141. // 带3个参数

  142. template typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  143. class FunctionWith3Parameter: public Function
  144. {
  145. public:
  146.     typedef void (*FunctionPtr)(Parameter1Type, Parameter2Type, Parameter3Type);

  147.     FunctionWith3Parameter(FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  148.         : _function_ptr(function_ptr), _parameter1(parameter1), _parameter2(parameter2), _parameter3(parameter3)
  149.     {
  150.     }

  151.     virtual void operator ()()
  152.     {
  153.         (*_function_ptr)(_parameter1, _parameter2, _parameter3);
  154.     }

  155. private:
  156.     FunctionPtr _function_ptr;
  157.     Parameter1Type _parameter1;
  158.     Parameter2Type _parameter2;
  159.     Parameter3Type _parameter3;
  160. };

  161. template class ObjectType, typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  162. class MemberFunctionWith3Parameter: public Function
  163. {
  164. public:
  165.     typedef void (ObjectType::*MemberFunctionPtr)(Parameter1Type, Parameter2Type, Parameter3Type);
  166.     MemberFunctionWith3Parameter(MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  167.         : _member_function_ptr(member_function_ptr), _object(object), _parameter1(parameter1), _parameter2(parameter2), _parameter3(parameter3)
  168.     {
  169.     }

  170.     virtual void operator ()()
  171.     {
  172.         (_object->*_member_function_ptr)(_parameter1, _parameter2, _parameter3);
  173.     }

  174. private:
  175.     MemberFunctionPtr _member_function_ptr;
  176.     ObjectType* _object;
  177.     Parameter1Type _parameter1;
  178.     Parameter2Type _parameter2;
  179.     Parameter3Type _parameter3;
  180. };

  181. ////////////////////////////////////////////////////////////////////////////////
  182. class Functor
  183. {
  184. public:
  185.     Functor()
  186.         : _function(NULL)
  187.     {
  188.     }
  189.     
  190.     Functor(const Functor& other)
  191.     {
  192.         _function = other._function;
  193.         
  194.         Functor& mutable_other = const_castFunctor&>(other);
  195.         mutable_other._function = NULL;
  196.     }

  197.     ~Functor()
  198.     {
  199.         delete _function;
  200.     }

  201.     Functor& operator =(const Functor& other)
  202.     {
  203.         _function = other._function;
  204.         
  205.         Functor& mutable_other = const_castFunctor&>(other);
  206.         mutable_other._function = NULL;

  207.         return *this;
  208.     }
  209.     
  210.     void operator ()()
  211.     {
  212.         (*_function)();
  213.     }
  214.     
  215.     // 不带参数
  216.     Functor(FunctionWithoutParameter::FunctionPtr function_ptr)
  217.     {
  218.         _function = new FunctionWithoutParameter(function_ptr);
  219.     }

  220.     template class ObjectType>
  221.     Functor(typename MemberFunctionWithoutParameterObjectType>::MemberFunctionPtr member_function_ptr, ObjectType* object)
  222.     {
  223.         _function = new MemberFunctionWithoutParameterObjectType>(member_function_ptr, object);
  224.     }
  225.    
  226.     // 带1个参数
  227.     template typename ParameterType>
  228.     Functor(typename FunctionWith1ParameterParameterType>::FunctionPtr function_ptr, ParameterType parameter)
  229.     {
  230.         _function = new FunctionWith1ParameterParameterType>(function_ptr, parameter);
  231.     }

  232.     template class ObjectType, typename ParameterType>
  233.     Functor(typename MemberFunctionWith1ParameterObjectType, ParameterType>::MemberFunctionPtr member_function_ptr, ObjectType* object, ParameterType parameter)
  234.     {
  235.         _function = new MemberFunctionWith1ParameterObjectType, ParameterType>(member_function_ptr, object, parameter);
  236.     }

  237.     // 带2个参数
  238.     template typename Parameter1Type, typename Parameter2Type>
  239.     Functor(typename FunctionWith2ParameterParameter1Type, Parameter2Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2)
  240.     {
  241.         _function = new FunctionWith2ParameterParameter1Type, Parameter2Type>(function_ptr, parameter1, parameter2);
  242.     }

  243.     template class ObjectType, typename Parameter1Type, typename Parameter2Type>
  244.     Functor(typename MemberFunctionWith2ParameterObjectType, Parameter1Type, Parameter2Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2)
  245.     {
  246.         _function = new MemberFunctionWith2ParameterObjectType, Parameter1Type, Parameter2Type>(member_function_ptr, object, parameter1, parameter2);
  247.     }

  248.     // 带3个参数
  249.     template typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  250.     Functor(typename FunctionWith3ParameterParameter1Type, Parameter2Type, Parameter3Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  251.     {
  252.         _function = new FunctionWith3ParameterParameter1Type, Parameter2Type, Parameter3Type>(function_ptr, parameter1, parameter2, parameter3);
  253.     }

  254.     template class ObjectType, typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  255.     Functor(typename MemberFunctionWith3ParameterObjectType, Parameter1Type, Parameter2Type, Parameter3Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  256.     {
  257.         _function = new MemberFunctionWith3ParameterObjectType, Parameter1Type, Parameter2Type, Parameter3Type>(member_function_ptr, object, parameter1, parameter2, parameter3);
  258.     }

  259. public:
  260.     Function* _function;
  261. };

  262. ////////////////////////////////////////////////////////////////////////////////
  263. // 不带参数

  264. Functor bind(FunctionWithoutParameter::FunctionPtr function_ptr)
  265. {
  266.     return Functor(function_ptr);
  267. }

  268. template class ObjectType>
  269. Functor bind(typename MemberFunctionWithoutParameterObjectType>::MemberFunctionPtr member_function_ptr, ObjectType* object)
  270. {
  271.     return Functor(member_function_ptr, object);
  272. }

  273. ////////////////////////////////////////////////////////////////////////////////
  274. // 带1个参数

  275. template typename ParameterType>
  276. Functor bind(typename FunctionWith1ParameterParameterType>::FunctionPtr function_ptr, ParameterType parameter)
  277. {
  278.     return Functor(function_ptr, parameter);
  279. }

  280. template class ObjectType, typename ParameterType>
  281. Functor bind(typename MemberFunctionWith1ParameterObjectType, ParameterType>::MemberFunctionPtr member_function_ptr, ObjectType* object, ParameterType parameter)
  282. {
  283.     return Functor(member_function_ptr, object, parameter);
  284. }

  285. ////////////////////////////////////////////////////////////////////////////////
  286. // 带2个参数

  287. template typename Parameter1Type, typename Parameter2Type>
  288. Functor bind(typename FunctionWith2ParameterParameter1Type, Parameter2Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2)
  289. {
  290.     return Functor(function_ptr, parameter1, parameter2);
  291. }

  292. template class ObjectType, typename Parameter1Type, typename Parameter2Type>
  293. Functor bind(typename MemberFunctionWith2ParameterObjectType, Parameter1Type, Parameter2Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2)
  294. {
  295.     return Functor(member_function_ptr, object, parameter1, parameter2);
  296. }

  297. ////////////////////////////////////////////////////////////////////////////////
  298. // 带3个参数

  299. template typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  300. Functor bind(typename FunctionWith3ParameterParameter1Type, Parameter2Type, Parameter3Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  301. {
  302.     return Functor(function_ptr, parameter1, parameter2, parameter3);
  303. }

  304. template class ObjectType, typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
  305. Functor bind(typename MemberFunctionWith3ParameterObjectType, Parameter1Type, Parameter2Type, Parameter3Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
  306. {
  307.     return Functor(member_function_ptr, object, parameter1, parameter2, parameter3);
  308. }

  309. ////////////////////////////////////////////////////////////////////////////////
  310. static void* thread_proc(void* parameter)
  311. {
  312.     Functor* functor = (Functor*)parameter;
  313.     (*functor)();

  314.     delete functor; // 记得这里需要delete
  315.     return NULL;
  316. }

  317. class CThreadEngine
  318. {
  319. public:
  320.     CThreadEngine(const Functor& functor)
  321.     {
  322.         // bind()返回的是一个临时对象,
  323.         // 故需要new一个,以便在thread_proc()过程中有效
  324.         Functor* new_functor = new Functor(functor);

  325.         int errcode = pthread_create(&_thread, NULL, thread_proc, new_functor);
  326.         if (errcode != 0)
  327.         {
  328.             delete new_functor;
  329.         }
  330.     }
  331.     
  332.     ~CThreadEngine()
  333.     {
  334.         join();
  335.     }
  336.     
  337.     void join()
  338.     {
  339.         if (_thread > 0)
  340.         {
  341.             pthread_join(_thread, NULL);
  342.             _thread = 0;
  343.         }
  344.     }

  345. private:
  346.     CThreadEngine();
  347.     CThreadEngine(const CThreadEngine&);
  348.     CThreadEngine& operator =(const CThreadEngine&);

  349. private:
  350.     pthread_t _thread;
  351. };

  352. ////////////////////////////////////////////////////////////////////////////////
  353. // 以下为测试代码
  354. #if defined(TEST_THREAD_ENGINE)

  355. ////////////////////////////////////////////////////////////////////////////////
  356. // 非类成员函数

  357. static void hello()
  358. {
  359.     printf("[%u] hello\n", pthread_self());
  360. }

  361. static void world()
  362. {
  363.     printf("[%u] world\n", pthread_self());
  364. }

  365. static void hello(int m)
  366. {
  367.     printf("[%u] hello: %d\n", pthread_self(), m);
  368. }

  369. static void world(int m)
  370. {
  371.     printf("[%u] world: %d\n", pthread_self(), m);
  372. }

  373. static void hello(int m, int n)
  374. {
  375.     printf("[%u] hello: %d/%d\n", pthread_self(), m, n);
  376. }

  377. static void world(int m, int n)
  378. {
  379.     printf("[%u] world: %d/%d\n", pthread_self(), m, n);
  380. }

  381. static void hello(int m, int n, int l)
  382. {
  383.     printf("[%u] hello: %d/%d/%d\n", pthread_self(), m, n, l);
  384. }

  385. static void world(int m, int n, int l)
  386. {
  387.     printf("[%u] world: %d/%d/%d\n", pthread_self(), m, n, l);
  388. }

  389. ////////////////////////////////////////////////////////////////////////////////
  390. // 类成员函数

  391. class X
  392. {
  393. public:
  394.     //
  395.     // 不带参数
  396.     //

  397.     void hello()
  398.     {
  399.         printf("[%u] X::hello\n", pthread_self());
  400.     }
  401.     
  402.     void world()
  403.     {
  404.         printf("[%u] X::world\n", pthread_self());
  405.     }
  406.     
  407.     //
  408.     // 带1个参数
  409.     //

  410.     void hello(int m)
  411.     {
  412.         printf("[%u] X::hello: %d\n", pthread_self(), m);
  413.     }
  414.     
  415.     void world(int m)
  416.     {
  417.         printf("[%u] X::world: %d\n", pthread_self(), m);
  418.     }

  419.     //
  420.     // 带2个参数
  421.     //

  422.     void hello(int m, int n)
  423.     {
  424.         printf("[%u] X::hello: %d/%d\n", pthread_self(), m, n);
  425.     }

  426.     void world(int m, int n)
  427.     {
  428.         printf("[%u] X::world: %d/%d\n", pthread_self(), m, n);
  429.     }

  430.     //
  431.     // 带3个参数
  432.     //

  433.     void hello(int m, int n, int l)
  434.     {
  435.         printf("[%u] X::hello: %d/%d/%d\n", pthread_self(), m, n, l);
  436.     }

  437.     void world(int m, int n, int l)
  438.     {
  439.         printf("[%u] X::world: %d/%d/%d\n", pthread_self(), m, n, l);
  440.     }
  441. };

  442. ////////////////////////////////////////////////////////////////////////////////
  443. int main()
  444. {
  445.     // 不带参数
  446.     CThreadEngine engine1(bind(&hello));
  447.     CThreadEngine engine2(bind(&world));
  448.     
  449.     X* x1 = new X;
  450.     X* x2 = new X;
  451.     CThreadEngine engine3(bind(&X::hello, x1));
  452.     CThreadEngine engine4(bind(&X::world, x2));

  453.     // 带1个参数
  454.     CThreadEngine engine5(bind(&hello, 2015));
  455.     CThreadEngine engine6(bind(&world, 2016));
  456.     
  457.     CThreadEngine engine7(bind(&X::hello, x1, 2015));
  458.     CThreadEngine engine8(bind(&X::world, x2, 2016));

  459.     // 带2个参数
  460.     CThreadEngine engine9(bind(&hello, 2015, 5));
  461.     CThreadEngine engine10(bind(&world, 2016, 5));

  462.     CThreadEngine engine11(bind(&X::hello, x1, 2015, 5));
  463.     CThreadEngine engine12(bind(&X::world, x2, 2016, 5));

  464.     // 带3个参数
  465.     CThreadEngine engine13(bind(&hello, 2015, 5, 3));
  466.     CThreadEngine engine14(bind(&world, 2016, 5, 3));

  467.     CThreadEngine engine15(bind(&X::hello, x1, 2015, 5, 3));
  468.     CThreadEngine engine16(bind(&X::world, x2, 2016, 5, 3));

  469.     // 按任意键继续继续
  470.     printf("Press ENTER to exit ...\n");
  471.     getchar();

  472.     engine1.join();
  473.     engine2.join();
  474.     engine3.join();
  475.     engine4.join();
  476.     engine5.join();
  477.     engine6.join();
  478.     engine7.join();
  479.     engine8.join();
  480.     
  481.     engine9.join();
  482.     engine10.join();
  483.     engine11.join();
  484.     engine12.join();
  485.     engine13.join();
  486.     engine14.join();
  487.     engine15.join();
  488.     engine16.join();

  489.     delete x1;
  490.     delete x2;
  491.     
  492.     // 按任意键继续退出
  493.     printf("Press ENTER to exit ...\n");
  494.     getchar();

  495.     return 0;
  496. }

  497. SYS_NAMESPACE_END
  498. #endif // TEST_THREAD_ENGINE
  499. #endif // MOOON_SYS_THREAD_ENGINE_H


相关文章
|
11天前
|
Java C++
C++的学习之路:21、继承(2)
C++的学习之路:21、继承(2)
16 0
|
1月前
|
Linux C++
LInux下Posix的传统线程示例
LInux下Posix的传统线程示例
20 1
|
3天前
|
Linux API C++
c++多线程——互斥锁
c++多线程——互斥锁
|
8天前
|
并行计算 调度 C++
|
11天前
|
安全 编译器 程序员
c++的学习之路:20、继承(1)
c++的学习之路:20、继承(1)
28 0
|
3天前
|
C++ 芯片
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
|
5天前
|
安全 Java 程序员
【C++笔记】从零开始认识继承
在编程中,继承是C++的核心特性,它允许类复用和扩展已有功能。继承自一个基类的派生类可以拥有基类的属性和方法,同时添加自己的特性。继承的起源是为了解决代码重复,提高模块化和可维护性。继承关系中的类形成层次结构,基类定义共性,派生类则根据需求添加特有功能。在继承时,需要注意成员函数的隐藏、作用域以及默认成员函数(的处理。此外,继承不支持友元关系的继承,静态成员在整个继承体系中是唯一的。虽然多继承和菱形继承可以提供复杂的设计,但它们可能导致二义性、数据冗余和性能问题,因此在实际编程中应谨慎使用。
7 1
【C++笔记】从零开始认识继承
|
8天前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
20 1
|
9天前
|
安全 Java 调度
C++从入门到精通:3.3多线程编程
C++从入门到精通:3.3多线程编程
|
10天前
|
编译器 C++
【C++进阶(八)】C++继承深度剖析
【C++进阶(八)】C++继承深度剖析