如何用C++轻松实现线程控制-1

    在C++中写一个线程是比较麻烦的事情,写一个安全的线程控制模块更是需要程序猿们更高的技术水平。首先做为一上C++程序猿经常与类打交道,很少会写一个独立全局函数去做一件事,这与线程函数有点违背。因为在C++开启线程函数

unsigned long _beginthreadex(void *security,

                                                unsigned stack_size,
                                                unsigned ( __stdcall *start_address )( void * ),
                                                void *arglist, /* 这个就是传给线程函数的参数的指针 */
                                                unsigned initflag,
                                                unsigned *thrdaddr );中需要传递一个线程函数,这个线程函数的类型为
unsigned ( __stdcall *start_address )( void * )。

    这个函数类型不能为类的一个成员函数。如果程序猿们要在一个类中开始一个线程且要在线程中操作这个类的对象,在代码实现上是比较别扭的。另外在线程的开启和退出时资源的释放也是比较困难的。

    所以,一个好的线程控制类要实现以下几点:

    1、很容易的创建一个线程,且线程函数是类的成员函数

    2、可以为每个线程声明一个名字,调试时可以出现线程的名称,方便调试每一个线程

    3、可以容易控制线程的开启与退出

    4、在线程退出时自动释放线程所点的资源

    5、在线程函数出现异常时,可以捕获并调用异常处理函数

    根据线程这5点要求,可以将线程控制类提供以下几个接口

class _CAsThread
{
public:
     _CAsThread();
     ~_CAsThread();
public:
     bool      Start   (void);       //负责创建线程,并启动线程
     bool      Stop   (void);       //等待线程完成退出并释放线程资源
     void      PrepareStop  (void);       //设置线程准备退出,当线程函数完成后,线程就退出,可不用调
     void      SetName   (const char* vName);
     unsigned  static __stdcall WorkItem  (void* vContext);
protected:
     virtual void    WorkThread  (void)  = 0;
     void      SetTranslator (void);       //添加线程异常捕获
public:

    bool m_bStart;                  //线程开启标记
    bool m_bExit;                  //线程退出标记
    char m_strName[100];             //线程名称
    HANDLE m_hThread;             //线程句柄
    ExceptFunc m_pExceptFun;        //线程异常处理函数
}; 

 

你可能感兴趣的:(C++,线程)