2011-08-25 129 views
0

我需要創建一個應該在類存在的時間內運行的線程。該線程應該與課程一起銷燬。使用這個通用設計進行編碼(加入析構函數)會是明智的嗎?我應該使用分離的線程嗎?在析構函數中pthead_join()類的成員變量線程是否明智?

class A { 
    public: 
     A() { pthread_create(m_thread, ...); } 
     ~A() { pthread_join(m_thread, ...); } 

    private: 
     pthread_t m_thrad; 
}; 

最後,我可以使用成員函數來產生線程,還是必須是靜態函數或全局函數?

回答

4

如果您從線程內部訪問A類中的數據,那麼您必須將它加入到析構函數中。一個分離的線程在它被銷燬之後會以其他方式訪問類數據,這只是未定義的行爲。

您的線程函數必須是靜態的或全局的。但是你可以將你的類的這個指針作爲arg參數傳遞給pthread_create,並將它返回到你的線程main函數中,並在你的類中調用一個普通的方法。所以你有一個非常苗條的靜態功能:

class X { 
    public: 
    X() { 
     pthread_create(m_thread, 0, ThreadStart, this); 
    } 
    private: 
    static void *ThreadStart(void *arg) { 
     static_cast<X *>(arg)->ThreadMain(); 
     return 0; 
    } 
    void ThreadMain() { 
    } 
    . 
    . 
    . 
}; 
0

我認爲這取決於什麼是A類。如果你知道這個線程會在你的A類的實例死後很快退出,那麼我猜你可以使用分離的線程。否則,我認爲你應該指示它應該退出並等待它的線程。

相關問題