2013-01-31 78 views
1

我想在C中使用主線程來打印結果,但當我創建線程時檢查線程ID,當我打印結果其2不同標識。這裏是我的代碼: CX打印結果與Pthread(主)C

#include <pthread.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <stdbool.h> 
#include <time.h> 
#include <sys/time.h> 

void *Utskrift(void *simpleInt) 
{ 
    int simple; 

simple = (int)simpleInt; 
/*Printing my result and thread id*/ 
printf(";Hello From Thread ! I got fed with 
an int %d! AND it is THREAD ::%d\n",simple,pthread_self()); 

} 


main(){ 

pthread_t thread_id; 
int test=2; 
/*Using main thread to print test from method Utskrift*/ 
pthread_create (&thread_id, NULL,&Utskrift,(void *) test); 
/*Taking look at my thread id*/ 
printf(" (pthread id %d) has started\n", pthread_self()); 
pthread_join(thread_id,NULL); 


} 

我新的線程編程和C爲好。所以我可能誤解了pthread_create (&thread_id, NULL,&Utskrift,(void *) test);。它是否使用我的主線程調用方法Utskrift並打印結果,還是創建一個新線程「孩子」到我的主線程,然後孩子打印結果?如果是這樣,你能請我解釋一下如何使用主線程來打印我的「測試」。

輸出:

(pthread id -1215916352) has started ;Hello From Thread ! I got fed with an int 2! AND it is THREAD ::-1215919248 
+0

您可以發佈您的輸出? – noMAD

+0

(pthread id -1215916352)已經開始 ; Hello From Thread!我吃了一個int 2!它是線程:: - 1215919248 –

+0

請在這裏發佈時請正確格式化您的代碼。另外你的'(void *)測試'東西是殘酷的。在你理解的狀態下,你絕對不應該使用演員,而後來當你更堅定地使用演員時,儘可能少。如果你從某個地方複製了這樣的東西,也許改變你的來源。 –

回答

0

pthread_create功能(spec)創建一個新的線程將執行(在這種情況下Utskrift)傳遞給它的功能。在pthread_create的最後一個參數中傳遞的值被傳遞給函數。

如果你只是想叫Utskrift功能在你的主線程,你可以做它的正常方式:

Utskrift((void *)test)); 

如果你想從你的完成線程的數據傳遞迴另一個線程,你可以使用pthread_join這將返回由你的線程的啓動程序返回的值,或線程傳遞給pthread_exit值:

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

void *checker(void *arg) { 
    int number = (int) arg; 

    if (0 == number) 
     return "number was zero"; 
    else 
     return "number was not zero"; 
} 

int main(void) { 
    int test = 0; 
    pthread_t thread_id; 
    char *s; 

    pthread_create (&thread_id, NULL, checker,(void *) test); 
    pthread_join(thread_id, &s); 
    printf("%s\n", s); 

    test = 1; 

    pthread_create (&thread_id, NULL, checker,(void *) test); 
    pthread_join(thread_id, &s); 
    printf("%s\n", s); 

    return 0; 
} 
+0

謝謝塞繆爾,這對我非常有幫助。我有我試過這個代碼,甚至修改了一下。現在我瞭解了這些工作人員的實際情況。我的下一個問題是,如果有可能通過pthread_join傳回數組?我無法修復它,只返回第一個元素,最後一個元素返回爲「98232179」數字。我認爲這是因爲逆轉* Myarray只返回第一個元素的值。你可以給一些例子,如何傳遞和pthread_join –

+0

@MaxMansour,不完全。數組在C語言中有點複雜。這似乎是一篇關於如何完成你想要的東西的好文章:http://www.eskimo.com/~scs/cclass/int/sx5.html –

+0

另外,如果這個答案解決你的問題,請選擇「接受」複選標記,以便我可以獲得積分,其他人會知道這個問題已被回答可以接受。 –

1

main()也是一個線程。所以當你創建一個線程時,你基本上從main()分叉,並在新線程中處理其他東西。 pthread_join()將等到您的新線程退出,然後繼續主線程。希望這是有道理的。

0

這條線main

printf(" (pthread id %d) has started\n", pthread_self()); 

正在打印主線程的並行線程ID,而不是一個你以前創建的。你在線程中得到的ID應該與thread_id中存儲的相同。你大概的意思是寫:

printf(" (pthread id %d) has started\n", thread_id); 

旁註:pthread_t往往不僅僅是一個int更大。我建議打印出來是這樣的:

printf("... %lu ...", ..., (unsigned long)thread_id, ...); 
+0

啊哈,所以我uderstod它的權利,如果我想打印somthing的主線程比我甚至不需要anotherer無效方法(如Utskrift)我可以簡單地做主要的printf,因爲主要還是一個線程? –

+0

@MaxMansour,是的,當你的程序啓動時,它已經是一個線程。你可能需要更多的線程來並行計算某些東西,或者同時做不同的事情。的確,如果你想要做的只是'printf',你不需要另一個線程。我會再說一遍,如果你不想讓事情並行運行,你不需要線程。 – Shahbaz