2011-02-14 48 views
3

我開始在linux上做pthread編程,並且在第一個程序中我完全搞不懂。下面是我正在運行的程序linux上的pthread執行

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

void *print_message_function(void *ptr); 

int main(){ 
pthread_t thread1, thread2; 
char *message1 = "Thread 1"; 
char *message2 = "Thread 2"; 
int iret1, iret2; 

/* Create independent threads each of which will execute function */ 

iret1 = pthread_create(&thread1, NULL, print_message_function, (void*) message1); 
iret2 = pthread_create(&thread2, NULL, print_message_function, (void*) message2); 

/* Wait till threads are complete before main continues. Unless we */ 
/* wait we run the risk of executing an exit which will terminate */ 
/* the process and all threads before the threads have completed. */ 

pthread_join(thread1, NULL); 
printf("amit"); 
pthread_join(thread2, NULL); 

printf("Thread 1 returns: %d\n",iret1); 
printf("Thread 2 returns: %d\n",iret2); 
exit(0); 
} 

void *print_message_function(void *ptr){ 
char *message; 
message = (char *) ptr; 
printf("%s \n", message); 
} 

我想知道的第一件事是線程執行的順序是不連續的?

第二件事是我intelectally把印刷(「阿米特」);看到main在thread1終止時真的停止了,但是在輸出中我們可以看到的是printf語句首先被執行。整個過程的輸出是

線程1

線程2

amitThread 1返回:0

線程2返回:0

+6

」是線程執行順序不是順序的「。這是正確的。如果你發現這裏有足夠的驚喜,請離開代碼並找到一本書的多線程編程。請一路閱讀本書。在編寫更多或更少的隨機代碼之前,您可能會尋找一個好的教程。這個問題相當複雜,而不是偶然探索的東西。 https://computing.llnl.gov/tutorials/pthreads/ – 2011-02-14 11:15:50

+0

這真的是輸出?它輸出`ajay`而不是`amit`?你有什麼問題? – Falmarri 2011-02-14 11:16:37

+0

對不起amit不ajay – 2011-02-14 11:17:30

回答

2

首先有一兩件事我想知道線程執行的順序是不是順序的?

不正常。大多數現代操作系統上的線程(Linux上的早期線程實現使用協作式多任務)並行執行,並且您的執行順序部分不確定。該pthread_join小號強加某種排序的事情,所以:因爲主線程等待線程1打印Amit1

  • Thread 2一定要來,因爲第二pthread_joinThread 1 returns:之前之前完成

    • Thread 1必須Amit面前。 main中的所有printf均按照出現在main中的順序顯示。

    我希望能回答你的問題。我不完全確定你在問什麼,但可以隨時要求澄清任何問題。

  • 11

    你說得對,線程執行順序不是連續的。在某種程度上,這就是使用線程的全部要點,即同時運行其他任務。

    您看到的輸出與預期的一樣,可能會有所不同。

    或許這將幫助:

    main   thread1  thread2 
        |     
        |--create--------+-----------\ 
        |    |   | 
        |   "Thread 1"  | "Thread 2" can 
        |    |   |<- occur anywhere 
        |    /   | along this line 
        join(1) ---------    | 
        |       | 
        |       | 
        "amit"       | 
        |       | 
        |       | 
        join(2) ---------------------/ 
        | 
        | 
    "Thread 1 returns" 
    "Thread 2 returns" 
        | 
        exit(0) 
    

    你擁有的唯一的保證是:

    • Thread 1」 將永遠是前 「amit」(打印,因爲pthread_join()等待線程1結束前主程序可以繼續)
    • Thread X returns ...」語句總是在兩個線程終止後結束。 「