次のC#コードスニペットでは、GetID()スレッドセーフですか?単純な整数メンバー変数を返すときのスレッドセーフティ
public class SharedData
{
protected int _nID = 0;
public int GetID()
{
return nID;
}
}
お返事ありがとうございます!
次のC#コードスニペットでは、GetID()スレッドセーフですか?単純な整数メンバー変数を返すときのスレッドセーフティ
public class SharedData
{
protected int _nID = 0;
public int GetID()
{
return nID;
}
}
お返事ありがとうございます!
読み取りはスレッドセーフです。 nID
に書き込むと問題になります。
これは何も変更しません。どのようにスレッドセーフなのか、スレッドセーフではないのでしょうか?
「スレッドセーフ」という言葉の意味によって異なります。たとえば、「スレッドセーフ」とは、「この変数へのすべての書き込みは、すべてのスレッドで一貫した順序で行われることが保証されます」、「いいえ、スレッドセーフ」という意味です。 「この変数のテストとセットで、結果が単一スレッドのデータ依存性ルールと一貫していることが保証されている」という場合は、「スレッドセーフ」ではありません。
"スレッドセーフ"とは何を意味するのかを慎重に定義し、すべてのライターと、それらのリーダーおよびライターにデータ依存性のあるすべてのコードを表示してから、意味のある意見を述べることができます。この質問には、意味のある質問に答えることさえできるほど十分な情報はありません。
申し訳ありません、その値を変更できるスレッドセーフなメンバ関数があるとします。 – bl23
@ bl23:この場合、 '_nID'を' volatile'とマークして、読み込みスレッドが古い値をキャッシュしないようにすることができます。 – LukeH
@ bl23:あなたの前提はあなた自身の質問です。読者のうちの1人がそうでなければ、「スレッドセーフ」であると言うのは全く意味がありません。スレッドの安全性は、個々の部品ではなく、*システム全体の特性です*。スレッドセーフであることを明確に定義できますか? –