9

このメソッドはスレッドセーフですか? そうじゃないらしい…

public static void Foo(string _str, Guid _id)
{
    _str = _str + _id.ToString();

    /*
        Do Stuff 
    */

    return 
}
4

2 に答える 2

22

この場合、パラメーターは 2 つの不変値です。メソッド内では、メソッドを呼び出す複数のスレッドがそれぞれ独自のスタックと実行コンテキストを持っているため、単一のスレッドのみがパラメーターのセットで動作します。つまり、各スレッドは独自の独立したパラメーターとローカル変数のセットを持ちます。スレッドはこれらの変数に影響を与える可能性があります。

そのため、これはこれら 2 つの変数に関して完全にスレッドセーフです。

ref によって渡されるパラメーターは、必ずしもスレッド セーフであるとは限らないことに注意してください。これは、1 つの変数が 2 つ以上のスレッド間で共有される可能性があり、同期が必要になる可能性があるためです。

また、不変ではない参照型のインスタンス (つまり、カスタム クラス) をパラメーターとして渡す場合、複数のスレッドで使用される可能性があるため、そのクラスの内部状態を同期する必要があります。参照自体は、コピーとして渡されるため (を使用して渡されない限りref)、スレッド セーフになります。

于 2013-06-21T19:18:10.323 に答える
5

パラメーター自体は、定義上、スレッドセーフです。方法の有無は問いstaticません。

ただし、それらは他のデータへの参照である可能性があり、それは自動的にスレッドセーフではありません。

あなたの例では、値型と不変の参照型を使用しているため、この特定のケースは問題ありません。

于 2013-06-21T19:20:44.957 に答える