5

(以下のすべては簡潔にするために単純化されています)

処理オブジェクトへの静的参照があります。

Processor には、処理する情報であるオブジェクト Package を渡すことができる関数が含まれています。

パッケージは、処理する必要がある多数のパッケージのリストから取得されます。これらのパッケージはユニークです。ここでは、同じオブジェクトへの複数の参照はありません。

toProcess でパッケージを並列処理できるように、多くのスレッドを開始します。スタックが空になるまで、スレッドは toProcess スタックから使用可能な Package を Pop() します。

私の質問は次のとおりです。 in が別のスレッドによって上書きされる危険を冒すことはできますかpackageCheckそれとも他のスレッドが の「コピーを作成」しCheckますか?

static class Program
{
    static Processor processor = new Processor();
    static Stack<Package> toProcess;
    static Object sync = new Object();

    static void RunThreads()
    {
        toProcess = GetPackages();
        //start many threads using the Work delegate
    }

    static void Work()
    {
        while(true)
        {
            Package p;
            lock(sync)
            {
                if(toProcess.Count == 0)
                   break;
                p = toProcess.Pop();
            }
            processor.Check(p);
        }
    }
}

class Processor
{
    public void Check(Package package)
    {
        //do many analyses on p and report results of p's analysis to elsewhere
    }
}

class Package
{
    //properties
}
4

3 に答える 3

3

私の質問は次のとおりです。Check のパッケージが別のスレッドによって上書きされる危険を冒すことはできますか、それとも他のスレッドが Check の「コピーを作成」しますか?

あなたが何を意味するのかは明確ではありませんが、独立した呼び出しごとCheckに独自のpackage変数があります。その変数は、そのスレッドだけでなく、その呼び出しに対してローカルですCheck(したがって、再帰呼び出しでも変更されません)。

Package複数の異なるスレッドで同じ参照を渡すとCheck、それらはすべて同じオブジェクトを処理することになり、問題が発生する可能性があります。ただし、package変数自体は異なる呼び出しで独立しています。

于 2012-09-07T16:18:32.787 に答える
2

Packageclass、つまり参照型であり、Check書き込み操作を実行する場合は、はい -ロックメカニズムを使用してアクセスを管理する必要があります。

一方Package、値型の場合は、値によって関数に渡されます。情報を読み取るCheckだけの場合(参照型であっても)、ロックについて心配する必要はありません。Package

于 2012-09-07T16:13:46.953 に答える
0

スタックのパッケージを複数のスレッドからポップできないことを保証するので、スタック内のパッケージがどれも同じでない限り、問題はないはずです。

Checkただし、 の状態が変更された場合は、メソッドでロックを実行する必要がありますProcessor

于 2012-09-07T16:19:23.713 に答える