草庐IT

non-volatile

全部标签

C# - 真的需要 "volatile"作为关键字吗?

随着我越来越深入地了解volatile关键字的含义,我一直对自己说“这是实现的方式,这不应该是一种高级编程语言”。我的意思是,CPU缓存数据这一事实对于JIT编译器来说应该很有趣,而不是C#程序员。一个重要的替代方案可能是属性(例如,VolatileAttribute)。你怎么看? 最佳答案 我觉得你走偏了。所有关于缓存等技术的东西都是试图用低层次的术语来解释它的一部分。volatile的功能描述是“我可能会被共享”。鉴于默认情况下线程之间无法共享任何内容,这并不奇怪。而且我认为基本足以保证在属性上使用关键字,但我认为它在很大程度上

c# - 低级差异 : non-static class with static method vs. 静态类与静态方法

我想知道使用具有静态方法的非静态类与具有相同静态方法的静态类的一般好处(或缺点)是什么,除了我不能使用非静态类中的静态方法作为扩展方法。例如:classNonStaticClass{publicstaticstringGetData(){return"Thiswasinvokedfromanon-staticclass.";}}与此相比:staticclassStaticClass{publicstaticstringGetData(){return"Thiswasinvokedfromastaticclass.";}}使用一种方法优于另一种方法对性能/内存有何影响?注意:假设我不需要

c# - volatile 变量有用吗?如果是,那么什么时候?

回复thisquestion让我想到了一些对我来说仍然不清楚的事情。让我们首先假设我们从thispost读取所有内容和thispost.[开始编辑]也许它不是那么明显(意大利幽默?!)但标题非常具有挑衅性:当然应该有一个原因,如果volatile已包含在C#中,我只是无法理解确切的内容。[结束编辑]简而言之,我们知道我们有三个工具可以在线程之间共享变量:lock因为这将阻止指令重新排序。volatile因为会强制CPU始终从内存中读取值(然后不同的CPU/内核不会缓存它,也不会看到旧值)。互锁操作(Increment/Decrement和CompareExchange)因为它们将在单个

c# - 流行的 "volatile polled flag"模式坏了吗?

假设我想使用一个bool状态标志来实现线程间的协作取消。(我意识到应该最好使用CancellationTokenSource代替;这不是这个问题的重点。)privatevolatilebool_stopping;publicvoidStart(){varthread=newThread(()=>{while(!_stopping){//Docomputationlastingaround10seconds.}});thread.Start();}publicvoidStop(){_stopping=true;}问题:如果我在另一个线程上在0秒调用Start()并在3秒调用Stop(),

c# - 何时使用 volatile 来抵消 C# 中的编译器优化

我花了大量时间在C#4.0中进行多线程编码。然而,有一个问题对我来说仍然没有答案。我知道volatile关键字会阻止编译器将变量存储在寄存器中,从而避免无意中读取过时的值。写入在.Net中总是易变的,因此任何说明它还避免过时写入的文档都是多余的。我也知道编译器优化有点“不可预测”。以下代码将说明由于编译器优化(在VS之外运行发布编译时)导致的停顿:classTest{publicstructData{publicint_loop;}publicstaticDatadata;publicstaticvoidMain(){data._loop=1;Testtest1=newTest();n

c# - CancellationTokenSource 与 volatile bool 值

使用CancellationTokenSource有什么好处吗?在volatile用于指示Task完成的bool字段? 最佳答案 当然可以。有许多。我会列出一些。CancellationToken支持回调。当请求取消时,您会收到通知。CancellationToken支持WaitHandle,您可以无限期地等待或超时。您可以使用CancellationTokenSource.CancelAfter方法安排取消CancellationToken。您可以将您的CancellationToken链接到另一个,这样当一个被取消时,另一个可以

c# - 何时在线程安全锁定代码中使用 'volatile' 或 'Thread.MemoryBarrier()'? (C#)

我什么时候应该使用volatile/Thread.MemoryBarrier()来保证线程安全? 最佳答案 当您想跨线程访问变量而不锁定时,您可以使用volatile/Thread.MemoryBarrier()。原子变量,例如int,总是一次性读取和写入整个变量。这意味着您永远不会在另一个线程更改它之前获得一半的值,而在它更改之后获得另一半。因此,您可以在不同线程中安全地读取和写入值,而无需同步。但是,编译器可能会优化一些读写操作,您可以使用volatile关键字来阻止这些操作。例如,如果您有这样的循环:sum=0;foreach

c# - .NET 中的变量新鲜度保证( volatile 与 volatile 读取)

我已经阅读了许多关于volatile和VoletileRead(ReadAcquireFence)的相互矛盾的信息(msdn、SO等)。我理解那些内存访问重新排序限制的含义-我仍然完全困惑的是新鲜度保证-这对我来说非常重要。msdndocforvolatile提及:(...)Thisensuresthatthemostup-to-datevalueispresentinthefieldatalltimes.msdndocforvolatilefields提及:Areadofavolatilefieldiscalledavolatileread.Avolatilereadhas"acqu

c# - 为什么局部变量在 C# 中不能是 volatile 的?

publicvoidMyTest(){booleventFinished=false;myEventRaiser.OnEvent+=delegate{doStuff();eventFinished=true;};myEventRaiser.RaiseEventInSeperateThread()while(!eventFinished)Thread.Sleep(1);Assert.That(stuff);}为什么eventFinished不能是易变的,这有关系吗?在我看来,在这种情况下,编译器或运行时可能会为了自己的利益而变得聪明,并在while循环中“知道”eventFinished

JavaScript 正则表达式 : find non-numeric character

假设我有这两个字符串:“5/15/1983”和“1983.05.15”。假设字符串中的所有字符都是数字,除了可以出现在字符串中任何位置的“分隔符”字符。只有一个分隔符;字符串中任何给定非数字字符的所有实例都将相同。如何使用正则表达式提取此字符?有没有比下面的方法更有效的方法?"05-15-1983".replace(/\d/g,"")[0];谢谢! 最佳答案 "05-15-1983".match(/\D/)从技术上讲,这会返回一个包含一个字符串的数组,但它会在您需要的大多数地方隐式转换为字符串。