【解決方法】静的関数はスレッドセーフですか


こんにちは、オンラインで検索したところ、静的関数は安全だと言う人もいれば、その逆だという人もいます。 かなり混乱しています。

論理的に考えれば、安全であるはずです。 でも、確かめる必要がある。

私が話している関数には、静的変数との相互作用がありません。 2 つのパラメータを受け取り、それらを操作するだけです。

簡略化した例を次に示します。

私が試したこと:

C++
static void copyOneToTheOther(Class1& c1, Class2& c2) 
{
 c1.intvariable = c2.intvariable;
 c1.stringvariable = c2.stringvariable;
}

多かれ少なかれこれほど単純です。
皆さんはどう思いますか?

解決策 1

いいえ、静的関数は本質的にスレッドセーフではありません。

あなたの単純な例でもそうではありません。 両方を仮定すると intvariablestringvariable 同時に更新されることになっているため、別のスレッドがその状態を監視する可能性があります。 c1 2 つの割り当ての間でデータが破損する可能性があります。

たとえば、2 つのスレッドがあり、1 つはコピーしていると想像してください。 c2c1、その他のコピー c1c2:

初期状態:

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

「メソッドはスレッドセーフである」か「メソッドはスレッドセーフではない」 – ここでのポイントは大きく異なると思います。
ここ (このクラス、このメソッド) では維持される状態がないため、このメソッドはスレッドセーフです。
渡されるパラメータはスレッドセーフではない可能性がありますが、それは呼び出し側の問題になります。
呼び出し側のパラメーターの処理方法がスレッドセーフではありません。

私にとって、このメソッドに関連してスレッド安全でない問題がある場合。
根本的な原因はこのメソッドではないため、呼び出し側を修正する必要があります。

コメント

タイトルとURLをコピーしました