Files
2026-07-09 11:27:59 +08:00

121 lines
2.7 KiB
C++

#ifndef threadH
#define threadH
#ifdef _WIN32
#include <windows.h>
//#include <process.h>
#else
#include <pthread.h>
#include "typedef.h"
#endif
#ifndef INFINITE
#define INFINITE 0x7FFFFFFF
#endif
//////////////////////////////
//
// 信号量
//
class CSema
{
protected:
bool m_bCreate;// 用来控制是否生成信号量,缺省情况下生成。
#ifdef _WIN32
HANDLE m_hSema;
/*#elif defined __MACOSX__
sem_t* m_pSema;
char m_sName[16];
static int m_smNo;
#else
sem_t m_hSema;
*/
#else
pthread_mutex_t mutex;
pthread_cond_t condition;
int semCount;
#endif
public:
CSema(const char *sName, unsigned int nInit, bool bCreate=true);
~CSema();
int ActP(DWORD dwTimeOut = INFINITE); // 等待状态
void ActV(); // 非等待状态
};
///////////////////////////////
//
// 互斥量
//
class CMutexLock
{
protected:
CSema * m_psmMut;
public:
CMutexLock(bool bCreate=true);
CMutexLock(CSema * pSema, DWORD dwTimeOut = INFINITE);
~CMutexLock();
};
///////////////////////////////
//
// 线程类
//
class CThread
{
public:
enum EPriority {
e_LowestPriority, // 其它所有线程都停止时运行
e_LowPriority, // 运行频率大约为普通优先级一半
e_NormalPriority, // 普通优先级
e_HighPriority, // 运行频率大约为普通优先级一倍
e_HighestPriority, // 独占CPU方式运行
e_NumPriorities
};
protected:
bool m_bSuspend;
bool m_bExit;
int m_nStackSize;
unsigned int m_nThreadId;
void ExitThread();//线程本身要求退出
#ifdef _WIN32
HANDLE m_hThreadHandle;
static unsigned int __stdcall MainFunction(void *threadPtr);
#else
pthread_t m_hThreadHandle;
pthread_attr_t m_tAttr;
bool m_bStart;
CSema m_smSuspend;
CSema m_smSleep;
static void* MainFunction(void *threadPtr);
unsigned long CompPSOSPrio(EPriority nPrioLevel);
#endif
public:
CThread(
unsigned stackSize, // Size of stack to use for thread.
EPriority priorityLevel = e_NormalPriority // Initial priority of thread.
);
~CThread();
virtual void Main()=0;
virtual void Suspend();
virtual void Resume();
virtual void Terminate();
virtual bool IsTerminated() const { return m_bExit; };
virtual bool IsSuspended() const { return m_bSuspend; };
virtual void SetPriority(EPriority priorityLevel);
virtual void Sleep(DWORD dwMilliseconds);
//HANDLE GetThreadID(){return m_hThreadHandle;};
#ifdef _WIN32
HANDLE GetThreadID(){return m_hThreadHandle;};
#else
unsigned long GetThreadID(){return m_hThreadHandle;};
#endif
};
#endif //_THREAD_H_