2011-04-28 29 views
2

我有這樣的C++代碼,在那裏我嘗試創建一個並行線程,和我有4個錯誤:在pthread_create錯誤在C++(內部類並行線程)

任何人都可以請幫助?

在此先感謝。

#include <pthread.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 

static void* func(void*); 

class Test 
{ 
public: 
    pthread_t *threadId; 
    pthread_create(threadId, NULL, func, NULL); 

}; 

static void* func(void *arg) 
{ 
    printf("Thread function called\n"); 
} 

int main() 
{ 
    Test(); 
} 

編譯:

# g++ simplepThread.cc -lpthread 
     simplepThread.cc:11: error: ‘threadId’ is not a type 
     simplepThread.cc:11: error: expected identifier before ‘__null’ 
     simplepThread.cc:11: error: expected ‘,’ or ‘...’ before ‘__null’ 
     simplepThread.cc:11: error: ISO C++ forbids declaration of ‘pthread_create’ with no type 

如果我使用的線程功能爲 「C」 鏈接:

extern "C" void* func(void *arg) 
{ 
    printf("Thread function called\n"); 
} 

錯誤面向的是:

simplepThread.cc:7: error: previous declaration of ‘void* func(void*)’ with ‘C++’ linkage 
simplepThread.cc:15: error: conflicts with new declaration with ‘C’ linkage 
+1

爲什麼要在類聲明中調用函數? – kennytm 2011-04-28 08:30:41

+0

我的設計要求是什麼解決方案。我會糾正這個? – kingsmasher1 2011-04-28 08:31:24

+0

@ kingsmasher1:這是無效的C++。單詞中的設計要求是什麼? – kennytm 2011-04-28 08:32:29

回答

2

你可以用」在類聲明中調用函數。在類聲明中,您只能聲明(並可能定義)其成員。並且

pthread_create(threadId, NULL, func, NULL); 

不是有效的成員函數定義。
全班測試似乎是多餘的。

static void* func(void *arg) 
{ 
    printf("Thread function called\n"); 
} 
int main() 
{ 
    pthread_t threadId; 

    pthread_create(&threadId, NULL, func, NULL); 
} 

應該可以正常工作。
我修復了另外一個問題 - 您試圖將未初始化的指針(threadId)傳遞給需要變量地址的函數。
UPDATE
關於聯動 - 你有一個默認的原型(C++聯動)

void* func(void *arg); 

和定義與C鏈接

extern "C" 
{ 
    void* func(void *arg) 
    { 
    .... 
    } 
} 

因此,他們的衝突。改變原型

extern "C" 
{ 
    void* func(void *arg); 
} 

這將是確定

+0

謝謝,是的,它解決後,我在類構造函數聲明它。 (。然而,你的「C」連接原型聲明是非常有用的。再次感謝。 – kingsmasher1 2011-04-28 08:46:41

2

有許多與你的代碼的問題。首先,你需要爲Test類聲明一個構造函數,並且給出你如何使用代碼,我會把pthread_create()調用放入構造函數中。其次,雖然pthread_create()將pthread_t *參數作爲其第一個參數,但這意味着該參數將被用作輸出參數,並且指針應該指向實際的內存/變量,其中新創建的線程的線程ID將爲放置。

#include <pthread.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 

static void* func(void*); 

class Test 
{ 
public: 
    pthread_t threadId; 

    Test() { 
     pthread_create(&threadId, NULL, func, NULL); 
    } 
}; 

static void* func(void *arg) 
{ 
    printf("Thread function called\n"); 
} 

int main() 
{ 
    Test(); 
} 

一般來說,當你正在做的多線程代碼,你還需要確保當你與他們完成的線程被破壞,或跟蹤,當他們死自己的。例如,如果您創建一個將用於異步處理後臺工作的「worker」線程,那麼您通常需要爲主線程設置一個受互斥鎖保護的隊列,以將工作傳遞給工作線程。當程序想要退出時,您通常還會需要一些信號燈或其他「安全」信號系統來使工作線程安全地死亡,並且具有一個後退信號機制,以便主線程知道工作人員何時死亡,現在是安全的清理共享數據結構。 (即,在工作隊列中放入一段簡單的說「死」的工作,並讓工作人員在退出前回復「正在死亡」)

實現正確的多線程代碼是非平凡的,您必須擔心廣泛的問題,例如死鎖和競態條件,這些問題在單線程代碼中不會發生。我強烈建議您閱讀並確保您完全理解這些和其他主題。

+0

謝謝,是的,我糾正了。 – kingsmasher1 2011-04-28 09:28:49