3

我想開發一個線程抽象(從Windows API的POSIX線程和線程),我非常喜歡它能夠使用方法指針啓動它們,而不是一個函數指針。使用方法指針啓動線程

我想要做的是將線程抽象爲具有純虛擬方法「runThread」的類,它將被植入將來的線程類中。

我還不知道Windows線程,但要啓動一個POSIX線程,您需要一個函數指針,而不是一個方法指針。 我無法設法找到一種方法與一個實例關聯,因此它可以作爲一個函數。 我可能只是找不到關鍵字(而且我一直在搜索很多),我認爲它幾乎是Boost :: Bind()所做的,所以它必須存在。

你能幫我嗎?

+0

它已經完成。請參閱Boost :: thread。如果這只是一個練習搜索stackoverflow更多。 PS。不,您可以使用任何C++功能,回調必須是外部「C」功能。但是從那裏你可以撥打任何東西。 – 2010-12-21 21:30:09

回答

1

您需要使用C++ API進行線程化。像boost :: thread(這幾乎與新C++中的API相同)。操作系統線程API通常以C語言編寫,您不能將非靜態成員函數指針傳遞給它們,也不能傳遞函數(這是boost :: bind創建的)。

9

不要這樣做。使用boost::thread

隨着boost::thread你可以用簽名void()的任何仿函數啓動線程,這樣你就可以在

struct MyAwesomeThread 
{ 
    void operator()() 
    { 
     // Do something with the data 
    } 

    // Add constructors, and perhaps a way to get 
    // a result back 

private: 
    // some data here 
}; 

MyAwesomeThread t(parameters) 
boost::thread(std::bind1st(std::mem_fun_ref(&t::operator()), t)); 

編輯使用std::mem_funstd::bind1st,這樣的:如果你真的想抽象POSIX線程(它並不難) ,你可以做(​​我離開你的pthread_attr的初始化)

class thread 
{ 
    virtual void run() = 0; // private method 

    static void run_thread_(void* ptr) 
    { 
     reinterpret_cast<thread*>(ptr)->run(); 
    } 

    pthread_t thread_; 
    pthread_attr_t attr_; 

public: 
    void launch() 
    { 
     pthread_create(&thread_, &attr_, &::run_thread_, reinterpret_cast<void*>(this)); 
    } 
}; 

boost::thread便攜,靈活,使用起來非常簡單。

+0

+1:解決這個問題所需的一切! – rubenvb 2010-12-21 20:38:12

2

你真的應該使用Boost.Thread。但是如果你不能,而且啓動一個線程的調用允許你傳遞一個參數給你的線程函數,那麼一個常見的習慣就是擁有一個獨立或靜態的成員函數來將參數轉換爲一個對象指針。例如

class Thread { 
public: 
    void start() { start_thread(_work, this); } // whatever call starts a thread 

    void work() {} // does thread work 

private: 
    static void _work(void* param) { 
    (reinterpret_cast<Thread*>(param))->work(); 
    } 
} 
0

那麼,它實際上是一個鍛鍊,我沒有使用任何東西(甚至沒有提升)的權利。當然,我不必這樣做(我只需要開發一個線程抽象),我只想:我曾經使用過SFML線程抽象,我只是喜歡它。這是一個性感的方式來處理它。

Ferruccio的方式似乎不錯! 如果work()方法是純虛擬的,它可以在任何實現線程抽象的類中實現......並且它會工作得很好,對嗎? (我不太確定它是否會,但根據我對C++的基本知識,我想它應該?)