1

「順序付けられていないスレッドの問題」という質問 に対するGrantCroftonの回答には、次のコメントがあります。

「そして、ロックを解除すると、最終的なカウントは100未満になる可能性があります。」

なんで?

これがコンテキストのコードです

class Program
{
    static object locker = new object();
    static int count=0;

    static void Main(string[] args)
    {
        for (int j = 0; j < 100; j++)
        {
            (new Thread(new ParameterizedThreadStart(dostuff))).Start(j);
        }
        Console.ReadKey();
    }

    static void dostuff(object Id)
    {
        lock (locker)
        {
            count++;
            Console.WriteLine("Thread {0}: Count is {1}", Id, count);
        }
    }
}
4

2 に答える 2

4

これは、ロックなしで発生する可能性があることです。

Count = 0

ThreadA Reads Count As 0 
ThreadB Reads Count As 0
ThreadA Writes New Incremented Count As 0 + 1
ThreadB Writes New Incremented Count As 0 + 1

Count = 1

これらは競合状態と呼ばれ、操作をアトミックにすることで解決されます

Count = 0

ThreadB Wins Race To Lock()
ThreadB Reads Count As 0
ThreadB Writes New Incremented Count As 0 + 1
ThreadB Unlocks

ThreadA Next for Lock()
ThreadA Reads Count As 1
ThreadA Writes New Incremented Count As 1 + 1
ThreadA Unlocks

Count = 2
于 2013-03-09T15:42:57.583 に答える
2

ロックは、count変数を一度にインクリメントしようとする複数のスレッドから変数を保護するためです。それが発生した場合、奇妙な結果をもたらす可能性があります。

ロックにより、スレッドは一度に1つだけ関数に入ることができるため、スレッド内の操作は一度に1つだけ実行されます。

これを削除すると、スレッドが同時に入り、これらの操作の途中で中断され、奇妙な結果や順不同の結果などが発生する可能性があります。

于 2013-03-09T15:32:56.197 に答える