- 论坛徽章:
- 0
|
你的意思是不是一个线程执行逻辑,执行完之后就停着不动了啊。
然后有任务的时候可以继续执行,然后再停止不动了啊。
看看这个能不能帮上你
#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();
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
.cpp
#include "Thread.h"
#include "Log.h"
G_Thread::G_Thread()
{
maskSIGUSR1();
// 定义SIGUSR1信号阻塞
sigemptyset(&g_waitSig);
sigaddset(&g_waitSig, SIGUSR1);
}
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);
} |
|