簡體   English   中英

為什么我在這個帶有C(LINUX)線程的小程序中得到這些結果?

[英]Why do I get these results in this small program with threads in C (LINUX)?

我有一個小程序,我在OS課程的考試科目中找到。

void * func (void * p) {
    int n = p;
    printf("%d \n",n);
    return NULL;
}

int main() {
    int i;
    pthread_t t[3];
    for(i=0; i<3; i+=1)
        pthread_create(&t[i] ,NULL, func, (void*)i);
    return 0;
}

當我運行它時,我得到以下結果(每個數字后面有一個新行):

第一輪:0 0
第二輪:1 0 2 2
第3輪:0 1 1

當我只創建3個線程時,為什么它會打印4位數。 它怎么打印重復?

該代碼在Ubuntu中使用gcc編譯。

終端的截圖

在退出main()之前,不要加入線程。 將以下內容添加到main()

for(i=0; i<3; i+=1)
    pthread_join(t[i], NULL);

當線程在程序退出時繼續執行時,不加入線程會導致未定義的行為 未定義的行為可以自由執行任何操作,包括打印重復項。

想一想,傳遞給線程的void*存儲在某個地方,一旦你提前退出main,你可能會破壞數據傳遞給線程,此時它可以接受任何值(包括重復的值) )。 但這甚至不值得嘗試解釋,因為它是未定義的行為

main函數return相當於對exit的調用並終止整個過程。 所以它或多或少隨機的輸出通過你的屏幕。 您應該執行以下操作之一

  • 加入您創建的所有主題
  • main的末尾調用pthread_exit而不是調用exit或使用return

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM