1. 程式人生 > >執行緒類基本封裝

執行緒類基本封裝

執行緒類


面向物件風格:
通過子類重寫run方法 實現多型 從而實現依賴反轉
但我們要提供抽象類和介面


將run()方法和startThread()方法宣告的私有的 其實本沒有有必要宣告為公有的 我們在start------>startThread ---->run
class Thread
{
Thread();
virtual ~Thread();
void start();
void join();

private:
static void* startThread(void *arg);
virtual void run() = 0;
pthread_t pthread_id;
};


//為什麼不直接將函式的run方法直接作為入口函式 (會隱含傳遞this指標 不符合pthread_create執行緒入口函式的定義 )
//解決方案 定義一個全域性的函式 但為了不讓外界能直擊訪問 定義為類的靜態成員 在該函式裡面呼叫run方法
//但是類得靜態成員函式是無法訪問類的非靜態成員或者函式的 因此我們在傳遞引數的時候需要將this指標傳遞進來 才能呼叫類的run方法


void Thread::start()
{
pthread_cretae(&pthread_id, NULL, startThread, this);
}


void* startThread(void *arg)
{
Thread* thread = (Thread*)arg;
thread->run();
return NULL;
}


基於物件的程式設計風格:
利用boost下的function和bind函式實現
#include <boost/function.hpp>


typedef boost::function<void ()>  ThreadFunc;


class Thread
{
public:
Thread(ThreadFunc thread_fun);
~Thread();
void start();
void join();
private:
static void* startThread(void *arg);
void run();
ThreadFunc thread_fun_;
pthread_t pthread_id;
};


Thread::Thread(ThreadFunc thread_fun):thread_func_(thread_fun)
{


}


void Thread::start()
{
pthread_create(&pthread_id, NULL, run, NULL);
}


void* startThread(void *arg)
{
Thread* thread = (Thread*)arg;
thread->run();
return NULL;
}


void Thread::run()
{
thread_fun_();
}