簡體   English   中英

在 C 中使用 pthreads 在循環中創建線程時是否需要延遲?

[英]Is a delay necessary when creating threads in a loop using pthreads in C?

我目前正在使用 pthreads 在 C 中編寫一個簡單的代碼。 它所做的只是創建 2 個線程,每個線程將整數數組的一半相加以獲得數組的總和。 但是,出於某種原因,每當我在線程創建之間沒有延遲地運行代碼時,數組的后半部分就會添加兩次。 添加最小延遲可以解決問題,但我很好奇它為什么會發生。 這是我用來創建線程的代碼:

for(i = 0; i < THREAD_NUM; ++i){
    args.thread_num = i;
    if(pthread_create(&threads[i], NULL, getSum, (void *)&args) != 0)
      printf("Can't create thread\n");
    //usleep(1);
  }

我添加的數字是數字 0 到 7,我希望總和為 28。但出於某種原因,沒有延遲,答案是 44,這是數字 4 到 7 相加兩次的總和,換句話說,后半部分的陣列。 取消注釋usleep ,答案是 28。有人可以提供有關正在發生的事情的見解。 謝謝你。

您將&args傳遞給新創建的線程,但是在下一次迭代中,您立即修改它並嘗試啟動另一個線程。 如果前一個線程在此修改后嘗試讀取thread_num怎么辦? 它會讀取錯誤的值。

絕對不要添加任意睡眠。 這永遠不是修復線程錯誤的正確方法。

相反,在這里,您應該停止為每個線程使用相同的args 為每個線程創建一個單獨的線程,這樣它們就不會共享數據。 您沒有顯示如何分配它,但它可能看起來像這樣:

struct args args[THREAD_NUM];

for (i = 0; i < THREAD_NUM; ++i) {
    args[i].thread_num = i;
    if (pthread_create(&threads[i], NULL, getSum, &args[i]) != 0) {
        printf("Can't create thread\n");
    }
}

暫無
暫無

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

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