我認爲我的程序有一個錯誤,因爲有時當我運行我的程序時,它會輸出一個比30000小的數字,比如29999.但有時它會正確運行並進入30000.我的問題是如何解決這個問題,爲什麼它發生了嗎?爲什麼我的線程計數器並不總是完成?
#include <iostream>
#include <thread>
using namespace std;
int counter;
int i;
void increment()
{
counter++;
}
int main()
{
counter = 0;
cout << "The value in counter is : " << counter << endl;
thread tarr[30000];
for (i = 0; i < 30000; i++)
{
tarr[i] = thread(increment);
}
for (i = 0; i < 30000; i++)
{
tarr[i].join(); //main thread waits for tarr to finish
}
cout << "After running 30,000 threads ";
cout << "the value in counter is : " << counter << endl;
return 0;
}
該增量是完全無人防守的* *和競爭條件的食譜。而且你應該感謝幾乎所有線程完成的速度,因爲30000個線程比大多數桌面操作系統能夠處理的大約多27000個,而不需要全身心投入,並且磨合到一個上下文切換的暫停狀態。 – WhozCraig
@aghilpro線程在最後兩個'cout'轉儲之前已經加入。你有什麼可能的好處,你猜測一個'睡眠'會做?\ – WhozCraig
一個良好的睡眠後,事情往往會更好。你醒來時已經清醒過來,準備再次看看代碼,並且......哦,「睡眠」。是的,這不會有所幫助。 – user4581301