我說:如何將成員函數作爲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*)'
如何正確地傳遞呢?
我說:如何將成員函數作爲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*)'
如何正確地傳遞呢?
指向一個成員函數是不的指針的函數。兩者並不相同。試圖使用一個指向成員函數的指針,就像它是一個指向函數的指針一樣......關於最好的你可能希望的是它會快速而乾淨地崩潰。
雖然它可能不是技術上定義的行爲,但至少有一個合理的機會,您可以使用指向靜態成員函數的指針。然後,您可以傳遞一個指向對象的指針作爲參數,並且它可以調用該對象的正確成員函數。
除此之外,你可以使用正常的功能像並行線程期待,並用它做。
指向「靜態」成員函數的指針將工作得很好,並且完全有效,並且在這種情況下使用它是已定義的行爲。 –
如果你想成員函數傳遞給需要一個函子功能,你應該這樣來做:一個使用函數指針,有過載採取成員函數
MyClass a;
some_function(&MyClass::MyMethod, a);
在STDLIB每個函數。如果你想通過它在std :: thread cotr,這樣做:
std::thread(&MyClass::MyMethod, a, arg1, arg2);
我建議你閱讀['std :: thread'](http://en.cppreference.com/w/ CPP /線程/線程)。 –
至於你的問題,簡單的答案是你*不能使用非靜態成員函數。所有非靜態成員函數都有一個隱含的「0」參數,即「this」指針。像'pthread_create'這樣的C函數不知道,所以不能通過它。 –