[ad_1]
こんにちは、オンラインで検索したところ、静的関数は安全だと言う人もいれば、その逆だという人もいます。 かなり混乱しています。
論理的に考えれば、安全であるはずです。 でも、確かめる必要がある。
私が話している関数には、静的変数との相互作用がありません。 2 つのパラメータを受け取り、それらを操作するだけです。
簡略化した例を次に示します。
私が試したこと:
static void copyOneToTheOther(Class1& c1, Class2& c2) { c1.intvariable = c2.intvariable; c1.stringvariable = c2.stringvariable; }
多かれ少なかれこれほど単純です。
皆さんはどう思いますか?
解決策 1
いいえ、静的関数は本質的にスレッドセーフではありません。
あなたの単純な例でもそうではありません。 両方を仮定すると intvariable
と stringvariable
同時に更新されることになっているため、別のスレッドがその状態を監視する可能性があります。 c1
2 つの割り当ての間でデータが破損する可能性があります。
たとえば、2 つのスレッドがあり、1 つはコピーしていると想像してください。 c2
に c1
、その他のコピー c1
に c2
:
初期状態:
c1: (42、「答え」)
c2:(13、「ラッキーナンバー」)
スレッド 1 が開始されます。c1.intvariable = c2.intvariable
c1:(13、「答え」)
c2:(13、「ラッキーナンバー」)
スレッド 2 が実行されます:c2.intvariable = c1.intvariable
c1:(13、「答え」)
c2:(13、「ラッキーナンバー」)
c2.stringvariable = c1.stringvariable
c1:(13、「答え」)
c2:(13、「答え」)
スレッド 1 が再開されます。c1.stringvariable = c2.stringvariable
c1:(13、「答え」)
c2:(13、「答え」)
両方の変数の状態が壊れています。
解決策 2
こんにちは、@Richard Deeming
「メソッドはスレッドセーフである」か「メソッドはスレッドセーフではない」 – ここでのポイントは大きく異なると思います。
ここ (このクラス、このメソッド) では維持される状態がないため、このメソッドはスレッドセーフです。
渡されるパラメータはスレッドセーフではない可能性がありますが、それは呼び出し側の問題になります。
呼び出し側のパラメーターの処理方法がスレッドセーフではありません。
私にとって、このメソッドに関連してスレッド安全でない問題がある場合。
根本的な原因はこのメソッドではないため、呼び出し側を修正する必要があります。
[ad_2]
コメント