x++
コンパイラーがインクリメントまたはデクリメントする単一の命令を生成すると仮定すると、x--
両方のスレッドが完了した後、for ループが実行される前と同じ値 (0) になります。
それ以外の場合は、次の例を見てみましょう。
x++:
1. MOV R1, x //register R1 receives x
2. INC R1 //register R1 is incremented
3. MOV x, R1 //store decremented x back to the memory
と
x--:
1. MOV R1, x //register R1 receives x
2. DEC R1 //register R1 is decremented
3. MOV x, R1 //store decremented x back to the memory
行 1 の実行後に 1 つのスレッドが CPU を失うと、値が更新されず、競合状態が発生し、変数が -5 と +5 の間の値を持つことは明らかです。あなたが指摘したように、両方のスレッドが持つことができる実行の異なる順序に応じて、スレッドは実行されます。