栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C#线程可以真正缓存一个值并忽略其他线程对该值的更改吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#线程可以真正缓存一个值并忽略其他线程对该值的更改吗?

关键是:它可能会起作用,但不能 保证
该规范能起作用。人们通常所追求的是能够以正确的理由工作的代码,而不是通过编译器,运行时和JIT的偶然组合来工作,这些代码 可能会
在框架版本,物理CPU,平台以及x86与x64。

了解内存模型是一个非常非常复杂的领域,我并不声称自己是专家。但是在这方面 真正专家的人向我保证,您所看到的行为无法得到保证。

您可以根据需要发布任意数量的工作示例,但是不幸的是,除了“它通常可以工作”之外,它并没有得到太多证明。当然不能证明它可以 保证
正常工作。只需反驳一个例子,但发现这就是问题所在…

不,我没有手。


使用可重复的反例进行更新:

using System.Threading;using System;static class BackgroundTaskDemo{    // make this volatile to fix it    private static bool stopping = false;    static void Main()    {        new Thread(DoWork).Start();        Thread.Sleep(5000);        stopping = true;        Console.WriteLine("Main exit");        Console.ReadLine();    }    static void DoWork()    {        int i = 0;        while (!stopping)        { i++;        }        Console.WriteLine("DoWork exit " + i);    }}

输出:

Main exit

但仍在全CPU下运行;请注意,此时

stopping
已设置为
true
。的
ReadLine
是,这样的过程不会终止。优化似乎取决于循环内代码的大小(因此
i++
)。显然,它仅在“发布”模式下有效。添加
volatile
,一切正常。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576196.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号