1

2つのスレッド(スレッド1)が整数変数を1000倍に増やしてから、スレッド2を終了するループを実行するマルチスレッドプログラムでは、整数変数を1000倍に減らしてから終了するループを実行します。

両方のスレッドはセマフォを待機し、ほぼ同時に開始し、ほぼ同時に異なるコアで実行されるようにスケジュールされています。

両方のスレッドが終了した後、整数変数の値はゼロになりますか?注:ロック(ミューテックスなど)は使用されません

Linuxとx86のアーキテクチャとマルチコアハードウェアを想定しましょう。

同じ整数が揮発性(C ++)として宣言されている場合、上記はどうなりますか?

4

5 に答える 5

5

揮発性であろうとなかろうと、特定の出力を期待することはできません([-1000,1000]の範囲を除く)。1回の同時書き込みでも、インクリメント/デクリメントの結果を損なう可能性があります(CPUレベルでもアトミックではありません)。

于 2012-08-21T12:11:59.853 に答える
5

複数のスレッドが同時に同じメモリ位置を変更する場合、プログラムにはデータ競合があり、その影響は未定義です。結果がまったく得られないと仮定すると、結果はほとんど何でもかまいません。整数型のような単純な変数の場合、アトミックはデータの競合を排除し、適切な同期を提供します。使用しますatomic_int(とも呼ばれますatomic<int>)。

于 2012-08-21T12:14:35.477 に答える
2

適切なアトミックと、場合によっては完全なメモリバリアを使用する必要があります。

volatileこの場合、何もしません(使用できるほど十分です)。

于 2012-08-21T12:12:35.960 に答える
2

整数の読み取り/書き込みは、アトミックである場合とそうでない場合があります。したがって、答えはノーです。結果は必ずしも0ではありません。

于 2012-08-21T12:12:59.457 に答える
2

インクリメントとデクリメントには、メモリから値をフェッチして変更し、メモリに書き戻すという3つの操作が必要です。ほとんどのプラットフォームでは、C ++ 11アトミック型、コンパイラ固有(またはアセンブリ)アトミック組み込み関数、またはロックを使用して特に要求しない限り、これら3つの操作がすべてアトミックに実行される保証はありません。

volatileスレッドの同期とは何の関係もありません。これは、メモリアクセスが実際に発生し、同じスレッド内の他の副作用と比較して正しく順序付けられることを保証するだけです。

于 2012-08-21T12:31:11.037 に答える