/// /// @file Thread.h /// @brief 线程的封装 , 子类继承并实现自己的功能 /// @author guozhiming /// @date 2007-05-16 /// #ifndef __G_THREAD__ #define __G_THREAD__ #include "def.h" class G_Thread { public: /// @brief 构造函数 G_Thread(); /// @brief 析构函数 ~G_Thread(); /// @brief 获得线程id /// /// @return 线程id pthread_t getThreadId(); /// @brief 启动线程 bool Start(); /// @brief 线程停止 void pause(); /// @brief 线程继续运行 void continues(); //看样子这个是与pause相对应的 private: /// @brief 屏蔽SIGUSR1信号 , POSIX标准建议在调用sigwait()等待信号以前,进程中所有线程都应屏蔽该信号,以保证仅有sigwait()的调用者获得该信号 , 如果不屏蔽该信号,在sigwait()之前调用pthread_kill()就会出现User defined signal 1. void maskSIGUSR1(); /// @brief 线程pid pthread_t g_pid; /// @brief 信号 sigset_t g_waitSig; /// @brief 线程运行主函数 /// /// @param arg /// /// @return static void *threadFun(void *arg); protected: virtual void Run() = 0; }; #endif
#include "Thread.h" #include "Log.h" G_Thread::G_Thread() { maskSIGUSR1();//看来这个是通用的。无论怎么用thread,都要加这一句了 // 定义SIGUSR1信号阻塞 sigemptyset(&g_waitSig); sigaddset(&g_waitSig, SIGUSR1);//上面已经用了mask函数,为什么这里还要来一下??? } G_Thread::~G_Thread() { } void G_Thread::maskSIGUSR1() { sigset_t sig; sigemptyset(&sig); sigaddset(&sig , SIGUSR1); pthread_sigmask(SIG_BLOCK , &sig , NULL); } pthread_t G_Thread::getThreadId() { return g_pid; } void *G_Thread::threadFun(void *arg) { G_Thread *pThread = (G_Thread*)arg; pThread->Run(); } bool G_Thread::Start() { int nRet = pthread_create(&g_pid , NULL , threadFun , this); if(0 == nRet) { nRet = pthread_detach(g_pid); if(nRet == 0) { return true; } } else { return false; } return true; } void G_Thread::pause() { int sig; sigwait(&g_waitSig , &sig);//又是信号的知识,未了解 } void G_Thread::continues() { pthread_kill(g_pid , SIGUSR1);//信号与线程的交互啊。 }
未完全理解透彻。。待整体把握后,再来看看
转载于:https://blog.51cto.com/no001/1317815