2

複数のスレッドからアクセスされる静的メソッドとそれらのスレッド セーフについて、多くの質問が寄せられてきました。スレッドの安全性を確保するという点ではほとんど理解できたと思いますが、静的メソッド自体のミックスに 'ref' 変数を導入する場合については、あまり確信が持てません。以下はカットダウンの例です:

public static string ProcessMessage(object msg)
{

string outcome = "";

Decrypt(ref msg);

// parse msg

return outcome;

}

private static void Decrypt(ref object msg)
{

// decrypt msg

}

上記の例はスレッドセーフですか? 静的メソッド内で行われるすべての処理は、ローカルで宣言された変数を使用します。それは、ある静的メソッドから別の静的メソッドに渡される ref オブジェクトだけです。

4

3 に答える 3

1

かどうstaticかではなく、これらのメソッドによって操作されるデータがどのように分離されるかについてです。

参照型を操作する場合、両方の例のコードに示されているように、スレッドセーフではありません。

スレッドセーフを確保するために、何らかのロックメカニズムを使用する必要があります。

于 2012-04-16T10:26:10.977 に答える
0

それ自体はスレッドセーフであるように思えますが、もちろん、同じ参照で複数のスレッドが呼び出すなど、外部要因が奇妙なことをするのを止めるものは何もありません。一部の開発者は、これはスレッドセーフではない可能性があると述べています。共通オブジェクトにスレッドセーフでないメンバーデータまたはそのようなデータに到達できるメソッドが含まれている場合がありますが、これはあなたの質問を少し極端にしています。

おそらくそれは私だけですか?

過去 30 年間に私が書いたほとんどすべての関数/プロシージャ、特にマルチスレッド アプリで動作するものは、スレッド セーフではないように思われます。

于 2012-04-16T11:08:50.427 に答える
0

refあなたのコードは、パラメーターをまったく必要としないようです。

安全性を確保するために、次のように変更できます。

public static string ProcessMessage(object msg)
{

string outcome = "";

object decryptedMsg = Decrypt(msg);    

// parse decryptedMsg

return outcome;

}

private static object Decrypt(object msg)
{
object processedMsg;

// decrypt msg into processedMsg

return processedMsg;

}

Decryptプライベートであり、 でmsgあるためobject、このコードは安全であり、コードと同じ結果を達成すると思います。

于 2012-04-16T11:19:32.603 に答える