C# と Java での過去の作業から、スレッドセーフではない次のようなステートメントに慣れています。
x += y;
ただし、上記のコードを Ruby と並行して実行した場合、スレッド間の衝突は観察できませんでした。
複数のスレッドが同時に同じデータに書き込むのを Ruby が自動的に防止することを読みました。これは本当ですか?+=
したがって、演算子はRubyでスレッドセーフですか?
C# と Java での過去の作業から、スレッドセーフではない次のようなステートメントに慣れています。
x += y;
ただし、上記のコードを Ruby と並行して実行した場合、スレッド間の衝突は観察できませんでした。
複数のスレッドが同時に同じデータに書き込むのを Ruby が自動的に防止することを読みました。これは本当ですか?+=
したがって、演算子はRubyでスレッドセーフですか?
まあ、それはあなたの実装と多くのものに依存します。MRI には、一度にどのスレッドが実際にコードを実行するかを制御する GVL (Giant VM Lock) などがあります。MRI では、Rubyコードを一度に実行できるスレッドは 1 つだけです。そのため、下にある C ライブラリは、Cコードで CPU を使用して巨大な数を乗算している間、別のスレッドを実行できますが、コード自体は同時に実行できません。つまり、割り当てなどのステートメントは、別の割り当てと同時には実行されない可能性があります (ただし、追加は並行して実行される場合があります)。int
他に起こりうることはこれです: Linux では sへの代入はアトミックだと聞いたと思います。
x += 1
あらゆる点で等しい
x = x + 1
( を再定義する+
と、 の結果も自動的に再定義されます+=
)
この表記法では、これがアトミック操作ではないこと、したがってスレッドセーフであることが保証されていないことは明らかです。