2011-08-03 45 views
0

我想在C++中使用TBB線程,並希望使用「tbb_thread」API。使用靜態函數在C++中使用TBB產生線程

例如我已經在類的靜態功能如下

template < typename threadFuncParamT > 
class ThreadWrapper 
{ 
public: 
    static int ThreadRoutineFunction(void* pParam); 
}; 

我想使用tbb_thread API產卵與被上述類定義的「ThreadRoutineFunction」的線程。我如何使用tbb_thread API來實現這一點。請注意,我必須將指針傳遞給線程例程功能。任何人都可以給我簡單的例子如何做到這一點?

回答

1

聽起來好像你的問題真的是「我怎麼得到一個指向static成員函數的指針?」

C++沒有正式的方法來做到這一點。但是,根據C++ FAQ(問題2中的註釋),「指針到static - 成員函數是通常類型與常規指針函數類型兼容」。

的選項有:

  1. 使用普通函數指針,指向它在您static成員函數,看看你的編譯器抱怨:

    int (*ptrFunction)(void*) = ThreadWrapper<Foo>::ThreadRoutineFunction; 
    
  2. 執行FAQ暗示什麼,並聲明你的函數extern "C"以及static(你還必須聲明函數的指針爲extern "C",並且你將不能重載函數):

    template <typename T> class ThreadWrapper { 
        public: 
        extern "C" static int ThreadRoutineFunction(void* param); 
    }; 
    
    extern "C" int(*ptrCFunction)(void*) = ThreadWrapper<Foo>::ThreadRoutineFunction; 
    
  3. 創建一個額外的函數,它只是調用static成員函數:

    template <typename T> int ThreadWrapperHelper(void* param) 
    { 
        return ThreadWrapper<T>::ThreadRoutineFunction(param); 
    } 
    
    int (*ptrFunction)(void*) = ThreadWrapperHelper<Foo>; 
    
+1

事實上,C++標準(2003年和2011版本)說,在一個腳註5.2 .2「靜態成員函數是普通函數」。另外在其他一些地方(例如3.9.2),指向靜態成員的指針相當於常規指針。因此,我認爲答案中的選項(1)應該適用於任何符合標準的編譯器。引用的FAQ建議使用'extern「C」'來避免在C++函數指針傳遞給C庫函數時調用約定問題;這個建議也適用於非會員功能。總的來說,一個好的和全面的答案; +1。 –

+0

謝謝,我沒有意識到那個音符。 –