線程Thread

怎麼設計本身的線程類?

首先要設計線程類的使用方式:
例如像java建立和啓動線程java

class Thread {};

Thread t = new Thread(線程方法)
t.start()
t.join()

線程類基本的對象:

  1. 線程的方法(線程要作什麼)
  2. 線程的標識(線程本身是誰)
  3. 線程的參數(這個要傳遞給線程方法)
  4. 線程的啓動(線程具有的性質)
  5. 是否等待子線程(線程具有的性質)
class Thread
{
public:
    typedef boost::function<void ()> Func;
    Thread(const Func& func);
    ~Thread();

    void start();
    void join();

private:
    Func       func_;
    phtread_id pid_;
};

基於對象設計方式:boost::function + boost::bind函數

線程啓動方式的設計

start() 是一個Thread的方法,而啓動線程使用的是pthread_create,須要傳入的是一個C函數,因此須要一個單獨的C函數startThread去作啓動線程這個工做。線程

void *startThread(void * args)
{
    ThreadData * data = static_cast<ThreadData*>(args);
    data->run();
}

startFunc函數中不可能知道Thread中的方法,因此須要設計一個單獨的線程數據類ThreadData,這個ThreadData是個內部類,它會獲得Thread類中的線程要執行方法,而後傳遞給startFunc,最後startFunc會調用ThreadData的run方法設計

ThreadData * data = new ThreadData(func_);
pthread_create(&tid_, NULL, startThread, data);
相關文章
相關標籤/搜索