加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么使用volatile产生不同的结果?

发布时间:2020-12-15 08:33:15 所属栏目:百科 来源:网络整理
导读:private const int Total = 500000; private static volatile int _count = 0; private static void Main() { Task task = Task.Factory.StartNew(Decrement); for (int i = 0; i Total; i++) { _count++; } task.Wait(); Console.WriteLine(_count); Consol
private const int Total = 500000;
    private static volatile int _count = 0;

    private static void Main()
    {
        Task task = Task.Factory.StartNew(Decrement);
        for (int i = 0; i < Total; i++)
        {
            _count++;
        }

        task.Wait();
        Console.WriteLine(_count);

        Console.ReadLine();
    }

    private static void Decrement()
    {
        for (int i = 0; i < Total; i++)
        {
            _count--;
        }
    }

有时结果为0,有时结果为-xxxxxx.我不知道为什么.任何人都可以解释它并告诉我正确的用法.

解决方法

volatile保证不对操作进行重新排序并禁用缓存优化,但不保证线程安全 – 因此您可以获得从0到-Total(如果每对 – 并且正确混合)的任何结果.我在回答 Why the following C# multi-threaded code does not output zero though it does in debugger?时已经涵盖了“preper mixing”.

当你期望别人修改值时,volatile是有用的,所以你的代码总是读取合理的最近值,这也是一致的(即你不会得到由0xffff的高部分和(0xffff 1)的低部分组成的int – 你因为volatile只适用于原子写入的类型,所以会得到一个或另一个.

如果要在2个线程中修改计数器 – 请使用Interlocked.Increment / Interlocked.Decrement.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读