使用公共静态

时间:2017-10-29 15:40:36

标签: c# multithreading

Another answer关于在c#中重现十进制值的撕裂线程读取,表明此代码成功地重现了一个撕裂的线程。我也能够在我的环境中成功地重现这种行为。但是,如果我将Decimal d;更改为public static Decimal d { get; set; },则不会再现撕裂的线程。那是为什么?

另外,我使用一系列锁定语句来防止断线。我能够永久地防止线程被撕裂的唯一方法就是能够有目的地生成破坏的线程,使用我在生产绑定代码中使用的相同方法应用锁定语句,并看到锁定成功地执行了它们的操作应该没有显着的性能影响。是否有更好的方法有目的地生成撕裂的线程?

如果更改为public static足以导致我的环境出现时间差异,那么我担心lock语句可能会导致相同的时序差异,而不是实际锁定什么我打算被锁定。有没有办法建立一个更好的试验台?

编辑:我的环境是 - 目标框架netcoreapp2.0,Windows 10 64位,英特尔酷睿i7-4712HQ。使用Any,x86或x64的不同平台目标不会影响我的环境中的测试结果。无论有没有建设和#34;优化代码"启用。

using System;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        void run()
        {
            Task.Run((Action)setter);
            Task.Run((Action)checker);

            Console.WriteLine("Press <ENTER> to stop");
            Console.ReadLine();
        }

        void setter()
        {
            while (true)
            {
                d = VALUE1;
                d = VALUE2;
            }
        }

        void checker()
        {
            for (int count = 0; ; ++count)
            {
                var t = d;

                if (t != VALUE1 && t != VALUE2)
                    Console.WriteLine("Value is torn after {0} iterations: {1}", count, t);
            }
        }

        static void Main()
        {
            new Program().run();
        }

        //Torn thread is not reproduced if this line changed to:
        //public static Decimal d { get; set; }
        Decimal d;

        const Decimal VALUE1 = 1m;
        const Decimal VALUE2 = 10000000000m;
    }
}

0 个答案:

没有答案