2014-03-12 47 views
0

我已經聲明在頭文件中的類定義的函數:錯誤而調用pthread_create的從()函數

class A 
{ 
    public: 
    ... 
    void* func(void *); 
    ... 
} 

在.c文件,我有一個指向類A的對象作爲PTR。

現在,當我創建並行線程:

iret1 = pthread_create(&thread1, NULL, ptr->func, NULL); 

它引發錯誤爲: 錯誤:一個指針指向一個綁定函數可能僅被用於調用該函數。

但是,當我聲明函數FUNC爲靜態的,這個錯誤不來的。

我只是想知道解決類似的問題,因爲我不能改變的功能的靜態,因爲我不能從它調用其他的非靜態成員。

+0

可能重複的[pthread函數從類](http://stackoverflow.com/questions/1151582/pthread-function-from-a-class) –

+0

重複http://stackoverflow.com/questions/1151582 /並行線程功能從 - 一類和http://stackoverflow.com/questions/2460219/attaching-member-function-of-a-class-in-pthread和http://stackoverflow.com/q/12975232/981959和其他幾十人 –

回答

0

不能使用非靜態成員函數作爲線程函數,或者作爲功能的任何非C++函數期待一個函數指針。原因是所有的非靜態成員函數都有一個隱藏的第一個參數,它變成了this指針。

在這種情況下,它可以使用靜態代理功能來解決:

class A 
{ 
public: 
    void* func(); 

    static void* wrapper(void* object) 
     { return reinterpret_cast<A*>(object)->func(); } 
}; 

... 

A* ptr = new A; 
iret1 = pthread_create(&thread1, NULL, &A::wrapper, ptr); 

這將創建A::wrapper作爲線程函數的線程,和實例指針傳遞作爲參數。然後A::wrapper函數使用這個參數作爲指向實例的指針,並調用實函數。


但是,如果你有一個C++ 11能夠編譯器和標準庫,也有更好的支持threads

A myA; 
std::thread myThread(&A::func, &myA); 

上述對象的創建創建一個線程,將調用A::func和根據需要將隱藏的第一個參數傳遞給函數。