7

C# と Java での過去の作業から、スレッドセーフではない次のようなステートメントに慣れています。

x += y;

ただし、上記のコードを Ruby と並行して実行した場合、スレッド間の衝突は観察できませんでした。

複数のスレッドが同時に同じデータに書き込むのを Ruby が自動的に防止することを読みました。これは本当ですか?+=したがって、演算子はRubyでスレッドセーフですか?

4

2 に答える 2

2

まあ、それはあなたの実装と多くのものに依存します。MRI には、一度にどのスレッドが実際にコードを実行するかを制御する GVL (Giant VM Lock) などがあります。MRI では、Rubyコードを一度に実行できるスレッドは 1 つだけです。そのため、下にある C ライブラリは、Cコードで CPU を使用して巨大な数を乗算している間、別のスレッドを実行できますが、コード自体は同時に実行できません。つまり、割り当てなどのステートメントは、別の割り当てと同時には実行されない可能性があります (ただし、追加は並行して実行される場合があります)。int他に起こりうることはこれです: Linux では sへの代入はアトミックだと聞いたと思います。

于 2012-06-27T23:23:53.503 に答える
0
x += 1

あらゆる点で等しい

x = x + 1

( を再定義する+と、 の結果も自動的に再定義されます+=)

この表記法では、これがアトミック操作ではないこと、したがってスレッドセーフであることが保証されていないことは明らかです。

于 2012-06-28T20:10:49.297 に答える