2013-08-16 66 views
-2

我說:如何將成員函數作爲pthread start_routine傳遞?

void* xxx::yyy(void* ThreadIdPtr) 

現在我做到這一點:

pthread_create(&tp, NULL, xxx::yyy, (void*) &i); 

但編譯錯誤:

error: argument of type 'void* (xxx::)(void*)' does not match 
'void* (*)(void*)' 

如何正確地傳遞呢?

+3

我建議你閱讀['std :: thread'](http://en.cppreference.com/w/ CPP /線程/線程)。 –

+2

至於你的問題,簡單的答案是你*不能使用非靜態成員函數。所有非靜態成員函數都有一個隱含的「0」參數,即「this」指針。像'pthread_create'這樣的C函數不知道,所以不能通過它。 –

回答

3

指向一個成員函數是的指針的函數。兩者並不相同。試圖使用一個指向成員函數的指針,就像它是一個指向函數的指針一樣......關於最好的你可能希望的是它會快速而乾淨地崩潰。

雖然它可能不是技術上定義的行爲,但至少有一個合理的機會,您可以使用指向靜態成員函數的指針。然後,您可以傳遞一個指向對象的指針作爲參數,並且它可以調用該對象的正確成員函數。

除此之外,你可以使用正常的功能像並行線程期待,並用它做。

+0

指向「靜態」成員函數的指針將工作得很好,並且完全有效,並且在這種情況下使用它是已定義的行爲。 –

0

如果你想成員函數傳遞給需要一個函子功能,你應該這樣來做:一個使用函數指針,有過載採取成員函數

MyClass a; 
some_function(&MyClass::MyMethod, a); 

在STDLIB每個函數。如果你想通過它在std :: thread cotr,這樣做:

std::thread(&MyClass::MyMethod, a, arg1, arg2); 
相關問題