C#递增/递减操作的螺纹安全性

C#递增/递减操作的螺纹安全性,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我试图研究一段简单的代码,其中两个线程访问一个共享整数变量,一个递增,另一个递减: static int n = 0; static void Main() { var up = new Task(() => { for (int j = 0; j < 400000; j++) ++n; }); up.Start(); for (int i = 0; i < 400000; i++)

我试图研究一段简单的代码,其中两个线程访问一个共享整数变量,一个递增,另一个递减:

static int n = 0;
static void Main()
{
    var up = new Task(() =>
    {
        for (int j = 0; j < 400000; j++)
           ++n;
    });

    up.Start();
    for (int i = 0; i < 400000; i++)
        --n;
    up.Wait();

    Console.WriteLine(n);
    Console.ReadKey();
}

分别。 那么,为什么上面的代码有时会输出非零值呢

那么,为什么上面的代码有时会输出非零值呢


因为。处理器将这些指令转换为较低级别的指令(例如,
inc
=>read+add+store)

,因为它们不是原子指令:

联锁同步顶部的缓存,确保不会发生中断


有更多细节。

谢谢,这当然可以解释问题。没有考虑汇编指令的原子性。
inc dword ptr ds:[29A0C9Ch]
dec dword ptr ds:[29A0C9Ch]