はcounter
周りにクロージャを作成するコードのこの部分を考えてみましょう:クロージャがあるときにインターロックを使用する必要がありますか?
uint counter = 0xFFFF;
someList.AsParallel().ForEach(a => { uint tmp = ++counter });
(一瞬のために取って並列foreachの中にカウンタを使用することの明らかな問題を設定してください)。
tmp
は0x0000または0x1FFFFになりますか?
私の推論:counter
を0xFFFFから0x10000に増やすには、少なくとも2バイトのCPU命令が必要で、それはマルチスレッドで中断する可能性があります。中断された場合、counter
の1バイトだけが更新される可能性があります。一時的に0x00000または0x1FFFFに設定することができます。
uint counter = 0xFFFF;
someList.AsParallel().ForEach(a => { uint tmp = Interlocked.Increment(counter) });
...:
私はこのように書かれているでしょうか?
私がAsParallel
を取り除くと、私は完全に安全ですか?