2015-12-07 27 views
0

我開始用一個簡單的例子 ​​ 我需要在不同CPPS和頭我具有如Process_Images.h並行線程在CPP對於不同的成員函數的一類

以下

類定義來劃分

void PrintHello(void* threadid); 
在Process_Images.cpp

void ProcessImages::PrintHello(void* threadid) 
{ 
    long tid; 
    tid = (long)threadid; 
    std::cout << "Hello World! Thread ID, " << tid << std::endl; 
    pthread_exit(NULL); 
} 

在主函數

ProcessImages PI; 

pthread_t threads[2]; 
pthread_create(&threads[0],NULL,PI.PrintHello,(void *)i); 

誤差 - >

/home/nvidia/Desktop/cms/tools/vibrante-vcm30t124-linux/cmsapplication_export/cmsapplication/sampleThread.cpp:333:69: error: cannot convert ���ProcessImages::PrintHello��� from type ���void (ProcessImages::)(void*)��� to type ���void* (*)(void*)��� 
     pthread_create(&threads[0],NULL,CarDetLEFT.PrintHello,(void *)i); 
                    ^

任何建議嗎?

+0

什麼是'我'?嘗試使用'&i' –

+0

不,使用C++ 11線程而不是pthreads!認真準備一個最小的例子,你可能會找到解決這個難題的人。 –

回答

0

兩個問題:

  • 線程函數必須返回void*,不void
  • 線程函數不能是(非靜態)成員函數

更多細節上可以找到pthread_create的參考頁面。

所以,ProcessImages::PrintHello返回類型更改爲void*並使其static:因爲我在這個問題看C++ 11的標籤

pthread_create(&threads[0], NULL, &ProcessImages::PrintHello, (void*) i); 
+0

我已經使它成爲靜態的,當我編譯時我將它改爲void *我得到了一個鏈接錯誤undefifined引用ProcessImages :: PrintHello(void +) – user3406305

+0

@ user3406305:您還需要相應地更新'ProcessImages :: PrintHello'的定義在Process_Images.cpp) –

+0

非常感謝它的成果 – user3406305

1

class ProcessImages { 

    //<SNIP> 

    public : 
    static void* PrintHello(void* threadid); 

    //<SNIP> 

}; 

那麼這應該更好地工作,絕對不需要走過線程!

std::thread thr(&ProcessImages::PrinteHello, &PI, &i); 

會對你有好處!

相關問題