このコードはスレッドセーフではないと言われました。
#include <iostream>
#include <thread>
static int sum[5];
static int get_sum()
{
int x=0;
for (int j=0;j<5;++j)
x += sum[j];
return x;
}
static void f1(int x){
sum[x] = 1;
std::cout << "f" <<x << ": " << sum[x] << " : " << get_sum() << std::endl;
}
int main() {
for (int j=0;j<5;++j)
sum[j] = 0;
std::thread t0(f1, 0);
std::thread t1(f1, 1);
std::thread t2(f1, 2);
std::thread t3(f1, 3);
std::thread t4(f1, 4);
while (get_sum() != 5) ;
t0.join();
t1.join();
t2.join();
t3.join();
t4.join();
std::cout << "final: " << get_sum() << std::endl;
}
プログラムが完了しない理由を誰か説明してもらえますか? get_sum の実行中の値が非決定論的であり、 cout からの出力がランダムにインターリーブされることはわかっていますが、それはプログラムの完了には関係ありません。