3

理論的な質問。以下の静的メソッドを呼び出すaspxWebページに100個の個別のリクエストが届く場合。

    public static GeocodeResult GeocodeQuery(string query)
    {
        int train, tube, dlr = 0;

        // manipulate these ints
        if (train)
        {
            // do something important
        }

    }

すべてのリクエストに個別のコールスタックがありますか?

もしそうなら-この静的メソッド呼び出しはこれらの別々の呼び出しスタックにプッシュされますか?

もしそうなら-したがって、これらのintはスレッドセーフですか?すなわち。100リクエスト、100コールフレーム、300int。

乾杯

4

3 に答える 3

6

はい、各リクエストには独自のコール スタックがあります。また、ローカル変数とメソッド パラメーターはスタックに格納されるため、各スタックにはquery、train、tube、dirの独自の値が含まれます。

したがって、何らかの共有状態にアクセスしない限り、このメソッドはスレッド セーフです。

于 2009-10-09T12:08:57.010 に答える
1

メソッドにコール スタックがあるわけではないことに注意してください。スレッドにはコール スタックがあります。メソッドはスレッドによって呼び出されます。

メソッドがインライン化されていない限り、メソッドを呼び出すとパラメーターがコール スタックにプッシュされる可能性がありますが、確実に戻りアドレスがコール スタックにプッシュされます。

各スレッドのコール スタックは、他のスレッドのコール スタックから独立しています。スタックのみがアクセスされる場合、メソッドはスレッドセーフです。

メソッドをスレッドセーフにしないために、他のストレージにアクセスすることができます。これには、静的データとインスタンス データ、およびそれらによって参照されるオブジェクトが含まれます。静的メソッドはインスタンス データにアクセスできないため、スレッド セーフになりやすくなります。静的データ、または静的データによって参照されるオブジェクトへのアクセスにのみ注意する必要があります。

private static int _balance;
private static void ThreadSafetyIssues()
{
    // Not thread  safe
    int temp = _balance;
    temp ++;
    _balance = temp;

    // Not thread safe
    temp = (int) HttpContext.Current.Session["balance"];
    temp ++;
    HttpContext.Current.Session["balance"] = temp;
}

HttpContext.Currentプロパティは静的です。これは、 を含むすべてのスレッドが同時にコンテキストにアクセスできることを意味しますSession_balanceこれは、上記の単純な static フィールドと同じようにスレッドセーフではありません。

于 2009-10-14T14:57:02.110 に答える
1

使用する変数がローカル変数またはパラメーターのみの場合、すべての静的メソッドはスレッドセーフです。

于 2009-10-09T13:15:20.593 に答える