c++ 线程基类 实现 笔记
class GThread {
public:
GThread();
virtual ~GThread();
public:
bool IsExit();
public:
virtual bool Start();
virtual void Stop();
protected:
virtual void run() = 0;
private:
static DWORD WINAPI ThreadRoute(LPVOID lpParam);
public:
HANDLE m_hThread;
protected:
bool m_bRunning;
std::string m_pName;
mutex mThread_mux;
};
GThread ::GThread ()
{
m_bRunning=false;
m_pName="";
m_hThread = INVALID_HANDLE_VALUE;
}
GThread ::~GThread ()
{
}
bool GThread ::IsExit()
{
return m_bRunning;
}
bool GThread ::Start()
{
DWORD ID=0;
mThread_mux.lock();
m_hThread = ::CreateThread(NULL, 0, GThread::ThreadRoute, this, 0, &dwThreadId);
if (INVALID_HANDLE_VALUE == m_hThread) {
#if DEBUG_GTHREAD
WriteLogE("Fail to start thread : %s.\n", m_pName.c_str());
#endif
mThread_mux.unlock();
return FALSE;
}
}
bool GThread ::stop()
{
mThread_mux.lock();
m_bRunning = false;
if (INVALID_HANDLE_VALUE != m_hThread){
if (WAIT_FAILED == WaitForSingleObject(m_hThread, INFINITE)) {
#if DEBUG_GTHREAD
WriteLogE("Terminate thread : %s.\n", m_pName.c_str());
#endif
TerminateThread(m_hThread, 0);
}
}
CloseHandle(m_hThread);
m_hThread = INVALID_HANDLE_VALUE;
}
DWORD GThread::ThreadRoute(LPVOID lpParam)
{
GThread *self = reinterpret_cast<GThread *>(lpParam);
#if DEBUG_GTHREAD
WriteLogD("Thread : %s is running.\n", self->m_pName.c_str());
#endif
self->run();
self->m_bRunning = FALSE;
#if DEBUG_GTHREAD
WriteLogD("Thread : %s exited.\n", self->m_pName.c_str());
#endif
return 0;
}
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
__drv_aliasesMem LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
lpThreadAttributes:
这是一个指向 SECURITY_ATTRIBUTES 结构的指针,用于定义新线程的安全性属性。可以为 NULL,表示新线程不继承调用线程的安全描述符。
dwStackSize:
指定新线程的初始栈大小。如果为0,则新线程使用默认大小。通常情况下,使用0以便系统自动为线程选择默认大小的栈空间。
lpStartAddress:
这是一个指向线程函数的指针,即新线程将要执行的函数的地址。线程函数的定义形式为 DWORD WINAPI ThreadFunc(LPVOID lpParam)。
lpParameter:
这是一个指向线程函数的参数的指针。可以通过该参数将数据传递给新线程。它的类型为 LPVOID,因此可以传递任何类型的数据,需要在线程函数内部进行适当的类型转换。
dwCreationFlags:
指定附加的标志来控制线程的创建方式。可以使用一些标志位进行控制,例如 CREATE_SUSPENDED 用于创建挂起的线程,直到调用 ResumeThread。
lpThreadId:
这是一个指向 DWORD 的指针,用于接收新创建线程的唯一标识符(线程ID)。可以为 NULL,表示不需要获取线程ID。
浙公网安备 33010602011771号