将 POSIX 线程映射到 C++ 代码






2.85/5 (5投票s)
将 POSIX 线程映射到面向对象 C++ 代码。
引言
本文描述了如何将原生的 C POSIX 线程模型映射到 C++ 的面向对象模型。
POSIX 线程
历史上,不同操作系统之间没有通用的线程接口。 厂商实现了各自版本的线程编程接口。 为了利用不同 UNIX 版本以及后来所有不同类型操作系统上线程的所有功能,必须使用标准的线程接口来实现 API。
1995 年,第一个 POSIX 线程标准得以实现。 今天,大多数硬件和/或操作系统厂商都实现了与 POSIX 线程 API 兼容的附加实现。
Using the Code
该代码围绕 POSIX 线程启动函数的标准 C 接口进行包装,并创建一个 C++ 类,封装了原生 C 代码,并将非静态成员定义为客户端接口。 因此,代码完全面向对象,而不是使用 C 编程接口的静态函数。
C++ 类 MyThread
是抽象的,因此必须派生它并实现 OnStart
方法。 当线程开始处理时会调用该方法,因此它很像主线程函数。 如果此函数返回,线程也会退出。
以下代码显示了 MyThread
类的头文件
#define NWTHREAD_EXIT_STATE_OK 0
#define NWTHREAD_EXIT_STATE_ERR 1
#define T_SUCCESS 0
#define T_OUT_OF_MEMORY 10
#define T_ERR_CREATE_THREAD 11
extern "C"
{
#include <pthread.h>
}
class ThreadArgs
{
friend class MyThread;
void * pArgs;
MyThread * pThis;
};
class MyThread
{
public:
enum ThreadState
{
Stopped = 0,
Running = 1
};
private:
ThreadState m_ThreadState;
pthread_t m_ThreadHandle;
long long m_lThreadID;
ThreadArgs * m_pArgs;
public:
MyThread();
virtual ~MyThread();
long long GetThreadID() { return m_lThreadID; }
void SetThreadID(long long iId) { m_lThreadID = iId; }
virtual int Start(void * args);
ThreadState GetThreadState() { return m_ThreadState; }
int GetExitState() { return m_ThreadExitState; }
void ExitThread();
protected:
int m_ThreadExitState;
virtual void OnStart(void * arg) = 0;
virtual void OnExit() { m_ThreadState = Stopped; }
private:
void * pArgs;
static void * ThreadStartWrapper(void * pThis);
};
如您在此头文件中所见,该类使用 ThreadStartWrapper
方法包装了来自 POSIX API 的 C 代码。
想法
需要考虑的一点是,使用 m_lThreadID
作为模板参数,从 MyThread
生成一个模板类。