2015-03-13 66 views
1

獲取在函數以下的錯誤,應採取一個int k和創建ķ並行線程:C++示數創建N個pthreads-

cse451.cpp:95:60:錯誤:從無效轉化 '無效*' 到'的pthread_t * {又名長無符號整型*}」 [-fpermissive]

cse451.cpp:97:54:錯誤:無效使用空隙表達的

我感覺它具有與FOO做()函數(此時僅用作佔位符foo(){})

相關的代碼如下所示(線95的pthread_t *線程......和線路97 ERR =在pthread_create ....)

void createThreads(int k){ 
int numThreads = k; 
int i = 0; 
int err = 0; 
pthread_t *threads = malloc(sizeof(pthread_t) * numThreads); 
for(i = 0;i<numThreads;i++){ 
    err = pthread_create(&threads[i], NULL, foo(), NULL); 
    if(err != 0){ 
     printf("error creating thread\n"); 
    } 
} 
} 

void foo(){} 
+1

請不要編輯的問題修復代碼。如果你這樣做的話,答案是沒有意義的。 – 2015-03-13 18:05:56

回答

4

第一個問題是,你想要編譯C與C++編譯器。這種轉換:

pthread_t *threads = malloc(sizeof(pthread_t) * numThreads); 

從由malloc返回無類型void*指針,到一個類型pthread_t*指針,被允許在C,但需要在C++中的鑄造。

pthread_t *threads = static_cast<pthread_t*>(malloc(sizeof(pthread_t) * numThreads)); 

但如果這意味着是C++,你會用

std::vector<pthread_t> threads(numThreads); 

更好,這樣你就不需要自己忙裏忙外的內存。您可能還想看看標準線程庫,它比POSIX線程更友好。

第二個問題是參數pthread_create應該是函數指針foo,而不是調用函數foo()的結果。你也有錯誤的函數類型;它必須接受和返回void*

void *foo(void*); 

它通過你(在這種情況下NULL)提供給pthread_create的說法,並返回一個指向任何你想收到時加入線程(return NULL;如果你不這樣做想要返回任何東西)。

+0

謝謝。那照顧了一個錯誤。仍在接收所述線97無效使用空隙表達錯誤 – GregH 2015-03-13 17:48:25

+0

@jeremy的:對不起,我沒有斑這一點。函數指針看起來像'foo'不是'foo()'。 – 2015-03-13 17:49:37

+0

似乎沒有解決這個問題。現在接收:cse451.cpp:97:52:錯誤:2:從無效的轉換 '無效(*)()' 到「無效*(*) 在文件從cse451.cpp包括0: 的/ usr /包括/ pthread.h:244:12:錯誤:初始化的參數3 '詮釋的pthread_創建(的pthread_t *,常量pthread_attr_t *,無效*(*)(無效*),無效*)'[-fpermissiv E] – GregH 2015-03-13 17:52:07

1
cse451.cpp:97:54: error: invalid use of void expression 

您需要的foo()函數指針傳遞給pthread_create(),而不是調用函數

pthread_create(&threads[i], NULL, foo, NULL); // << See the parenthesis are 
               // omitted 
3

至少有兩個錯誤:

  • 你需要傳遞指向pthread_create的第三個參數的函數的指針,而不是對打算在該線程中運行的函數的調用結果。
  • 該功能的原型應該是類似於

    void * f(void *);

    I.e.它應該把一個指向void的指針作爲參數,並返回一個指向void的指針。

您的來電在pthread_create應該是這個樣子:

void *foo(void*); 
err = pthread_create(&threads[i], NULL, foo, NULL);