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

时间:2022-06-06
本文章向大家介绍C++两种线程模式:委托和继承(附示例),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

继承方式实现简单,请参见: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): 委托版本使用非常简单:

 					
 static void hello(int m, int n)
  
 {
 
 				    printf("[%u] hello: %d/%dn", pthread_self(), m, n);
 
 }
 
 
 
 class X
 
 {
 
 public:
 
 				    void world(int m, int n, int l)
 
 {
 
 				        printf("[%u] X::world: %d/%d/%dn", pthread_self(), m, n, l);
 
 }
 
 };
 
 
 
 int main()
 
 {
 
      X* x2 = new X;
 
  
 // 带2个参数
 
 				    CThreadEngine engine9(bind(&hello, 2015, 5));
 
 
 
 // 带3个参数
 
 				    CThreadEngine engine16(bind(&X::world, x2, 2016, 5, 3));
 
 				    return 0;
 
 } 

委托版本实现:

 #ifndef MOOON_SYS_THREAD_ENGINE_H
  
 			#define MOOON_SYS_THREAD_ENGINE_H
 
 
 
 // 如果测试,请不需注释掉TEST_THREAD_ENGINE的定义
 
 //#define TEST_THREAD_ENGINE 1
 
 
 
 			#if !defined(TEST_THREAD_ENGINE)
 
 			#include "mooon/sys/config.h" // 如果需要脱离mooon运行,请注释掉这行
 
 			#endif // TEST_THREAD_ENGINE
 
 
 
 			#include <pthread.h>
 
 			#include <stdio.h>
 
 			#include <unistd.h>
 
 
 
 			#if defined(TEST_THREAD_ENGINE)
 
 			#define SYS_NAMESPACE_BEGIN
 
 			#define SYS_NAMESPACE_END
 
 			#endif // TEST_THREAD_ENGINE
 
 			SYS_NAMESPACE_BEGIN
 
 
 
 // 基类
 
 class Function
 
 {
 
 public:
 
 			    virtual ~Function() {}
 
 			    virtual void operator ()() = 0;
 
 };
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 不带参数
 
 
 
 class FunctionWithoutParameter: public Function
 
 {
 
 public:
 
 // 不使用返回值,所以不需要返回值,否则将void替换成需要的类型
 
 			    typedef void (*FunctionPtr)();
 
 
 
 			    FunctionWithoutParameter(FunctionPtr function_ptr)
 
 : _function_ptr(function_ptr)
 
 {
 
 }
 
 
 
 			    virtual void operator ()()
 
 {
 
 (*_function_ptr)();
 
 }
 
 
 
 private:
 
 			    FunctionPtr _function_ptr;
 
 };
 
 
 
 			template <class ObjectType>
 
 class MemberFunctionWithoutParameter: public Function
 
 {
 
 public:
 
 			    typedef void (ObjectType::*MemberFunctionPtr)();
 
 			    MemberFunctionWithoutParameter(MemberFunctionPtr member_function_ptr, ObjectType* object)
 
 : _member_function_ptr(member_function_ptr), _object(object)
 
 {
 
 }
 
 
 
 			    virtual void operator ()()
 
 {
 
 (_object->*_member_function_ptr)();
 
 }
 
 
 
 private:
 
 			    MemberFunctionPtr _member_function_ptr;
 
 			    ObjectType* _object;
 
 };
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 带1个参数
 
 
 
 			template <typename ParameterType>
 
 class FunctionWith1Parameter: public Function
 
 {
 
 public:
 
 			    typedef void (*FunctionPtr)(ParameterType);
 
 
 
 			    FunctionWith1Parameter(FunctionPtr function_ptr, ParameterType parameter)
 
 : _function_ptr(function_ptr), _parameter(parameter)
 
 {
 
 }
 
 
 
 			    virtual void operator ()()
 
 {
 
 (*_function_ptr)(_parameter);
 
 }
 
 
 
 private:
 
 			    FunctionPtr _function_ptr;
 
 			    ParameterType _parameter;
 
 };
 
 
 
 			template <class ObjectType, typename ParameterType>
 
 class MemberFunctionWith1Parameter: public Function
 
 {
 
 public:
 
 			    typedef void (ObjectType::*MemberFunctionPtr)(ParameterType);
 
 			    MemberFunctionWith1Parameter(MemberFunctionPtr member_function_ptr, ObjectType* object, ParameterType parameter)
 
 : _member_function_ptr(member_function_ptr), _object(object), _parameter(parameter)
 
 {
 
 }
 
 
 
 			    virtual void operator ()()
 
 {
 
 (_object->*_member_function_ptr)(_parameter);
 
 }
 
 
 
 private:
 
 			    MemberFunctionPtr _member_function_ptr;
 
 			    ObjectType* _object;
 
 			    ParameterType _parameter;
 
 };
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 带2个参数
 
 
 
 			template <typename Parameter1Type, typename Parameter2Type>
 
 class FunctionWith2Parameter: public Function
 
 {
 
 public:
 
 			    typedef void (*FunctionPtr)(Parameter1Type, Parameter2Type);
 
 
 
 			    FunctionWith2Parameter(FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2)
 
 : _function_ptr(function_ptr), _parameter1(parameter1), _parameter2(parameter2)
 
 {
 
 }
 
 
 
 			    virtual void operator ()()
 
 {
 
 (*_function_ptr)(_parameter1, _parameter2);
 
 }
 
 
 
 private:
 
 			    FunctionPtr _function_ptr;
 
 			    Parameter1Type _parameter1;
 
 			    Parameter2Type _parameter2;
 
 };
 
 
 
 			template <class ObjectType, typename Parameter1Type, typename Parameter2Type>
 
 class MemberFunctionWith2Parameter: public Function
 
 {
 
 public:
 
 			    typedef void (ObjectType::*MemberFunctionPtr)(Parameter1Type, Parameter2Type);
 
 			    MemberFunctionWith2Parameter(MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2)
 
 : _member_function_ptr(member_function_ptr), _object(object), _parameter1(parameter1), _parameter2(parameter2)
 
 {
 
 }
 
 
 
 			    virtual void operator ()()
 
 {
 
 (_object->*_member_function_ptr)(_parameter1, _parameter2);
 
 }
 
 
 
 private:
 
 			    MemberFunctionPtr _member_function_ptr;
 
 			    ObjectType* _object;
 
 			    Parameter1Type _parameter1;
 
 			    Parameter2Type _parameter2;
 
 };
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 带3个参数
 
 
 
 			template <typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
 
 class FunctionWith3Parameter: public Function
 
 {
 
 public:
 
 			    typedef void (*FunctionPtr)(Parameter1Type, Parameter2Type, Parameter3Type);
 
 
 
 			    FunctionWith3Parameter(FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
 
 : _function_ptr(function_ptr), _parameter1(parameter1), _parameter2(parameter2), _parameter3(parameter3)
 
 {
 
 }
 
 
 
 			    virtual void operator ()()
 
 {
 
 (*_function_ptr)(_parameter1, _parameter2, _parameter3);
 
 }
 
 
 
 private:
 
 			    FunctionPtr _function_ptr;
 
 			    Parameter1Type _parameter1;
 
 			    Parameter2Type _parameter2;
 
 			    Parameter3Type _parameter3;
 
 };
 
 
 
 			template <class ObjectType, typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
 
 class MemberFunctionWith3Parameter: public Function
 
 {
 
 public:
 
 			    typedef void (ObjectType::*MemberFunctionPtr)(Parameter1Type, Parameter2Type, Parameter3Type);
 
 			    MemberFunctionWith3Parameter(MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
 
 : _member_function_ptr(member_function_ptr), _object(object), _parameter1(parameter1), _parameter2(parameter2), _parameter3(parameter3)
 
 {
 
 }
 
 
 
 			    virtual void operator ()()
 
 {
 
 (_object->*_member_function_ptr)(_parameter1, _parameter2, _parameter3);
 
 }
 
 
 
 private:
 
 			    MemberFunctionPtr _member_function_ptr;
 
 			    ObjectType* _object;
 
 			    Parameter1Type _parameter1;
 
 			    Parameter2Type _parameter2;
 
 			    Parameter3Type _parameter3;
 
 };
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 class Functor
 
 {
 
 public:
 
 			    Functor()
 
 : _function(NULL)
 
 {
 
 }
 
 
 
 			    Functor(const Functor& other)
 
 {
 
 			        _function = other._function;
 
 
 
 			        Functor& mutable_other = const_cast<Functor&>(other);
 
 			        mutable_other._function = NULL;
 
 }
 
 
 
 ~Functor()
 
 {
 
 			        delete _function;
 
 }
 
 
 
 			    Functor& operator =(const Functor& other)
 
 {
 
 			        _function = other._function;
 
 
 
 			        Functor& mutable_other = const_cast<Functor&>(other);
 
 			        mutable_other._function = NULL;
 
 
 
 			        return *this;
 
 }
 
 
 
 			    void operator ()()
 
 {
 
 (*_function)();
 
 }
 
 
 
 // 不带参数
 
 			    Functor(FunctionWithoutParameter::FunctionPtr function_ptr)
 
 {
 
 			        _function = new FunctionWithoutParameter(function_ptr);
 
 }
 
 
 
 			    template <class ObjectType>
 
 			    Functor(typename MemberFunctionWithoutParameter<ObjectType>::MemberFunctionPtr member_function_ptr, ObjectType* object)
 
 {
 
 			        _function = new MemberFunctionWithoutParameter<ObjectType>(member_function_ptr, object);
 
 }
 
 
 
 // 带1个参数
 
 			    template <typename ParameterType>
 
 			    Functor(typename FunctionWith1Parameter<ParameterType>::FunctionPtr function_ptr, ParameterType parameter)
 
 {
 
 			        _function = new FunctionWith1Parameter<ParameterType>(function_ptr, parameter);
 
 }
 
 
 
 			    template <class ObjectType, typename ParameterType>
 
 			    Functor(typename MemberFunctionWith1Parameter<ObjectType, ParameterType>::MemberFunctionPtr member_function_ptr, ObjectType* object, ParameterType parameter)
 
 {
 
 			        _function = new MemberFunctionWith1Parameter<ObjectType, ParameterType>(member_function_ptr, object, parameter);
 
 }
 
 
 
 // 带2个参数
 
 			    template <typename Parameter1Type, typename Parameter2Type>
 
 			    Functor(typename FunctionWith2Parameter<Parameter1Type, Parameter2Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2)
 
 {
 
 			        _function = new FunctionWith2Parameter<Parameter1Type, Parameter2Type>(function_ptr, parameter1, parameter2);
 
 }
 
 
 
 			    template <class ObjectType, typename Parameter1Type, typename Parameter2Type>
 
 			    Functor(typename MemberFunctionWith2Parameter<ObjectType, Parameter1Type, Parameter2Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2)
 
 {
 
 			        _function = new MemberFunctionWith2Parameter<ObjectType, Parameter1Type, Parameter2Type>(member_function_ptr, object, parameter1, parameter2);
 
 }
 
 
 
 // 带3个参数
 
 			    template <typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
 
 			    Functor(typename FunctionWith3Parameter<Parameter1Type, Parameter2Type, Parameter3Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
 
 {
 
 			        _function = new FunctionWith3Parameter<Parameter1Type, Parameter2Type, Parameter3Type>(function_ptr, parameter1, parameter2, parameter3);
 
 }
 
 
 
 			    template <class ObjectType, typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
 
 			    Functor(typename MemberFunctionWith3Parameter<ObjectType, Parameter1Type, Parameter2Type, Parameter3Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
 
 {
 
 			        _function = new MemberFunctionWith3Parameter<ObjectType, Parameter1Type, Parameter2Type, Parameter3Type>(member_function_ptr, object, parameter1, parameter2, parameter3);
 
 }
 
 
 
 public:
 
 Function* _function;
 
 };
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 不带参数
 
 
 
 			Functor bind(FunctionWithoutParameter::FunctionPtr function_ptr)
 
 {
 
 			    return Functor(function_ptr); 
 
 }
 
 
 
 			template <class ObjectType>
 
 			Functor bind(typename MemberFunctionWithoutParameter<ObjectType>::MemberFunctionPtr member_function_ptr, ObjectType* object)
 
 {
 
 			    return Functor(member_function_ptr, object);
 
 }
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 带1个参数
 
 
 
 			template <typename ParameterType>
 
 			Functor bind(typename FunctionWith1Parameter<ParameterType>::FunctionPtr function_ptr, ParameterType parameter)
 
 {
 
 			    return Functor(function_ptr, parameter); 
 
 }
 
 
 
 			template <class ObjectType, typename ParameterType>
 
 			Functor bind(typename MemberFunctionWith1Parameter<ObjectType, ParameterType>::MemberFunctionPtr member_function_ptr, ObjectType* object, ParameterType parameter)
 
 {
 
 			    return Functor(member_function_ptr, object, parameter);
 
 }
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 带2个参数
 
 
 
 			template <typename Parameter1Type, typename Parameter2Type>
 
 			Functor bind(typename FunctionWith2Parameter<Parameter1Type, Parameter2Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2)
 
 {
 
 			    return Functor(function_ptr, parameter1, parameter2);
 
 }
 
 
 
 			template <class ObjectType, typename Parameter1Type, typename Parameter2Type>
 
 			Functor bind(typename MemberFunctionWith2Parameter<ObjectType, Parameter1Type, Parameter2Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2)
 
 {
 
 			    return Functor(member_function_ptr, object, parameter1, parameter2);
 
 }
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 带3个参数
 
 
 
 			template <typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
 
 			Functor bind(typename FunctionWith3Parameter<Parameter1Type, Parameter2Type, Parameter3Type>::FunctionPtr function_ptr, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
 
 {
 
 			    return Functor(function_ptr, parameter1, parameter2, parameter3);
 
 }
 
 
 
 			template <class ObjectType, typename Parameter1Type, typename Parameter2Type, typename Parameter3Type>
 
 			Functor bind(typename MemberFunctionWith3Parameter<ObjectType, Parameter1Type, Parameter2Type, Parameter3Type>::MemberFunctionPtr member_function_ptr, ObjectType* object, Parameter1Type parameter1, Parameter2Type parameter2, Parameter3Type parameter3)
 
 {
 
 			    return Functor(member_function_ptr, object, parameter1, parameter2, parameter3);
 
 }
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 			static void* thread_proc(void* parameter)
 
 {
 
 			    Functor* functor = (Functor*)parameter;
 
 (*functor)();
 
 
 
 			    delete functor; // 记得这里需要delete
 
 			    return NULL;
 
 }
 
 
 
 class CThreadEngine
 
 {
 
 public:
 
 			    CThreadEngine(const Functor& functor)
 
 {
 
 // bind()返回的是一个临时对象,
 
 // 故需要new一个,以便在thread_proc()过程中有效
 
 			        Functor* new_functor = new Functor(functor);
 
 
 
 int errcode = pthread_create(&_thread, NULL, thread_proc, new_functor);
 
 if (errcode != 0)
 
 {
 
 			            delete new_functor;
 
 }
 
 }
 
 
 
 ~CThreadEngine()
 
 {
 
 join();
 
 }
 
 
 
 			    void join()
 
 {
 
 if (_thread > 0)
 
 {
 
 			            pthread_join(_thread, NULL);
 
 			            _thread = 0;
 
 }
 
 }
 
 
 
 private:
 
 			    CThreadEngine();
 
 			    CThreadEngine(const CThreadEngine&);
 
 			    CThreadEngine& operator =(const CThreadEngine&);
 
 
 
 private:
 
 			    pthread_t _thread;
 
 };
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 以下为测试代码
 
 			#if defined(TEST_THREAD_ENGINE)
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 非类成员函数
 
 
 
 			static void hello()
 
 {
 
 			    printf("[%u] hellon", pthread_self());
 
 }
 
 
 
 			static void world()
 
 {
 
 			    printf("[%u] worldn", pthread_self());
 
 }
 
 
 
 			static void hello(int m)
 
 {
 
 			    printf("[%u] hello: %dn", pthread_self(), m);
 
 }
 
 
 
 			static void world(int m)
 
 {
 
 			    printf("[%u] world: %dn", pthread_self(), m);
 
 }
 
 
 
 			static void hello(int m, int n)
 
 {
 
 			    printf("[%u] hello: %d/%dn", pthread_self(), m, n);
 
 }
 
 
 
 			static void world(int m, int n)
 
 {
 
 			    printf("[%u] world: %d/%dn", pthread_self(), m, n);
 
 }
 
 
 
 			static void hello(int m, int n, int l)
 
 {
 
 			    printf("[%u] hello: %d/%d/%dn", pthread_self(), m, n, l);
 
 }
 
 
 
 			static void world(int m, int n, int l)
 
 {
 
 			    printf("[%u] world: %d/%d/%dn", pthread_self(), m, n, l);
 
 }
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 // 类成员函数
 
 
 
 class X
 
 {
 
 public:
 
 //
 
 // 不带参数
 
 //
 
 
 
 			    void hello()
 
 {
 
 			        printf("[%u] X::hellon", pthread_self());
 
 }
 
 
 
 			    void world()
 
 {
 
 			        printf("[%u] X::worldn", pthread_self());
 
 }
 
 
 
 //
 
 // 带1个参数
 
 //
 
 
 
 			    void hello(int m)
 
 {
 
 			        printf("[%u] X::hello: %dn", pthread_self(), m);
 
 }
 
 
 
 			    void world(int m)
 
 {
 
 			        printf("[%u] X::world: %dn", pthread_self(), m);
 
 }
 
 
 
 //
 
 // 带2个参数
 
 //
 
 
 
 			    void hello(int m, int n)
 
 {
 
 			        printf("[%u] X::hello: %d/%dn", pthread_self(), m, n);
 
 }
 
 
 
 			    void world(int m, int n)
 
 {
 
 			        printf("[%u] X::world: %d/%dn", pthread_self(), m, n);
 
 }
 
 
 
 //
 
 // 带3个参数
 
 //
 
 
 
 			    void hello(int m, int n, int l)
 
 {
 
 			        printf("[%u] X::hello: %d/%d/%dn", pthread_self(), m, n, l);
 
 }
 
 
 
 			    void world(int m, int n, int l)
 
 {
 
 			        printf("[%u] X::world: %d/%d/%dn", pthread_self(), m, n, l);
 
 }
 
 };
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
 int main()
 
 {
 
 // 不带参数
 
 			    CThreadEngine engine1(bind(&hello));
 
 			    CThreadEngine engine2(bind(&world));
 
 
 
 			    X* x1 = new X;
 
 			    X* x2 = new X;
 
 			    CThreadEngine engine3(bind(&X::hello, x1));
 
 			    CThreadEngine engine4(bind(&X::world, x2));
 
 
 
 // 带1个参数
 
 			    CThreadEngine engine5(bind(&hello, 2015));
 
 			    CThreadEngine engine6(bind(&world, 2016));
 
 
 
 			    CThreadEngine engine7(bind(&X::hello, x1, 2015));
 
 			    CThreadEngine engine8(bind(&X::world, x2, 2016)); 
 
 
 
 // 带2个参数
 
 			    CThreadEngine engine9(bind(&hello, 2015, 5));
 
 			    CThreadEngine engine10(bind(&world, 2016, 5));
 
 
 
 			    CThreadEngine engine11(bind(&X::hello, x1, 2015, 5));
 
 			    CThreadEngine engine12(bind(&X::world, x2, 2016, 5));
 
 
 
 // 带3个参数
 
 			    CThreadEngine engine13(bind(&hello, 2015, 5, 3));
 
 			    CThreadEngine engine14(bind(&world, 2016, 5, 3));
 
 
 
 			    CThreadEngine engine15(bind(&X::hello, x1, 2015, 5, 3));
 
 			    CThreadEngine engine16(bind(&X::world, x2, 2016, 5, 3));
 
 
 
 // 按任意键继续继续
 
 			    printf("Press ENTER to exit ...n");
 
 			    getchar();
 
 
 
 			    engine1.join();
 
 			    engine2.join();
 
 			    engine3.join();
 
 			    engine4.join();
 
 			    engine5.join();
 
 			    engine6.join();
 
 			    engine7.join();
 
 			    engine8.join();
 
 
 
 			    engine9.join();
 
 			    engine10.join();
 
 			    engine11.join();
 
 			    engine12.join();
 
 			    engine13.join();
 
 			    engine14.join();
 
 			    engine15.join();
 
 			    engine16.join();
 
 
 
 			    delete x1;
 
 			    delete x2;
 
 
 
 // 按任意键继续退出
 
 			    printf("Press ENTER to exit ...n");
 
 			    getchar();
 
 
 
 			    return 0;
 
 }
 
 
 
 			SYS_NAMESPACE_END
 
 			#endif // TEST_THREAD_ENGINE
 
 			#endif // MOOON_SYS_THREAD_ENGINE_H