65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.85/5 (5投票s)

2008年6月8日

CPOL

1分钟阅读

viewsIcon

28611

downloadIcon

227

将 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 生成一个模板类。

© . All rights reserved.