变新鲜担保.NET(挥发性与挥发性读)(Variable freshness guarantee in .NET (volatile vs. volatile read))

   IT问题网   2018-05-27 00:00:00

问 题

我看了很多矛盾的信息(msdn,so等)有关的挥发性和voletileread(readacquirefence)。

据我所知,内存访问重新排序的限制暗示 - 什么,我还是完全感到困惑的是新鲜的保证 - 这对我来说是非常重要的。

msdn文档挥发性提及

(...)这确保了最先进的最新值是在任何时候都present在外地。

msdn挥发性领域doc 提到:

volatile字段的读取被称为挥发性读取。挥发性读了"收购语义";也就是说,它是保证之前到存储器之后它发生在指令序列中的任何引用发生

<一个href="http://www.dotnetframework.org/default.aspx/4@0/4@0/untmp/devdiv_tfs/dev10/releases/rtmrel/ndp/clr/src/bcl/system/threading/thread@cs/1305376/thread@cs" 。相对="nofollow"> net $ c $下volatileread 是:

 公共静态int volatileread(ref int地址)
{
int ret =地址;
memorybarrier(); //调用memorybarrier,以确保正确的语义在一个便携的方式。
返回ret;
}
 

根据 msdn memorybarrier doc 记忆障碍prevents重新排序。然而,这似乎并没有对新鲜度产生任何影响 - 正确

可以那么如何得到新鲜的保证? 而且是有标记领域的挥发性和volatileread和volatilewrite语义访问它之间的区别是什么?我目前在做以后我的表现至关重要code,它需要保证新鲜度,但读者有时会过时的价值。我不知道是否标志着国家动荡会使情况有所不同。

edit1:

我试图实现 - 得到保证读线程将获得共享变量的最新值(由多个作家写的)地 - 比什么是上下文切换或其他操作可能的成本理想的年龄不推迟状态的直接写。

如果挥发或更高级别的结构(如锁)有此担保(是吗?)不是他们如何做到这一点?

edit2:

非常简明的问题应该是 - 我如何得到新鲜的价值保证在内容可能?理想的情况是无锁(如独占访问是没有必要而且有潜在的高争)。

这是我学到的东西在这里,我想知道,这可能是解决(解决()行标有注释):

 私人sharedstate _sharedstate;
私人自旋锁_spinlock =新的自旋锁(假);

公共无效更新(sharedstate newvalue)以
{
布尔locktaken = false;
_spinlock.enter(ref locktaken);

_sharedstate =为newvalue;

如果(locktaken)
{
_spinlock.exit();
}
}

公共sharedstate getfreshsharedstate
{
得到
{
thread.memorybarrier(); // ----这是加入到给读者新鲜感保障
var值= _sharedstate;
thread.memorybarrier();
返回值;
}
}
 

该memorybarrier呼叫加入确保两个 - 读取和写入 - 包裹由全栅栏(同锁code- 这里显示的 http://www.albahari.com/threading/part4.aspx#_the_volatile_keyword '记忆障碍和锁定'一节)

这是否看起来是正确的或者是有缺陷?

edit3:

由于很有趣的讨论,在这里我学到了不少东西,我居然能提炼成简单明确的问题,我对这个话题。这是从原来的完全不同,所以我宁愿在这里发布一个新的: <一个href="http://stackoverflow.com/questions/24726904/memory-barrier-vs-interlocked-impact-on-memory-caches-coherency-timing">memory屏障vs内存交错影响缓存一致性时间

解决方案

我觉得这是一个很好的问题。但是,它也难以回答。我不知道我可以给你一个明确的答案的答案。这不是你的错真的。这只是题材是复杂的,真正需要知道的细节,可能无法一一列举可行的。老实说,这真的好像你不吝自己对这个问题非常好了。我花了很多时间去研究这个问题我自己,我还没有完全明白了一切。尽管如此,我还是会尝试进行回答的一些外表这里反正。

那么,什么意思一个线程反正读一个新的价值?这是否意味着由读返回的值是保证不超过100毫秒,50毫秒,1毫秒或旧的?还是意味着该值是绝对的最新消息?还是意味着,如果两个读出现背到后面,然后第二个是保证得到一个新的假设值在第一次读取后更改的内存地址?还是意味着别的东西完全?

我认为你将有一个很难让你的读者可以正常工作,如果你正在考虑的事情在时间间隔方面。而不是想着事情,当你读链一起会发生什么条款。为了说明我的观点考虑使用任意复杂的逻辑,你将如何实现互锁式的操作。

 公共静态牛逼interlockedoperation t(ref牛逼的位置,t操作数)
{
牛逼最初,计算;
做
{
初始=位置;
计算= op(初始,操作数); //其中op被替换为一个具体的实施
}
而(interlocked.compareexchange(参考位置,计算,初始)=初始!);
返回计算;
}
 

在code以上,我们可以创建任何互锁式的操作,如果我们利用一个事实,即位置通过第二读互锁.compareexchange 将保证返回的更新的值,如果内存地址接收到写第一读取之后。这是因为 interlocked.compareexchange 方法生成一个内存屏障。如果该值已更改之间读取那么code围绕循环旋转,直到位置停止变化。这种模式不要求的code使用的最新的新鲜的价值;短短的更新的值。这种区别是至关重要的。 1

有一个很大的锁免费code我看到的这个主要工作。即这些操作通常包装成环,使得操作被连续重试,直到成功为止。它并不认为第一个尝试使用的最新的的值。它也没有承担每次使用的价值是的最新的的。它只是假设值的更新的每次读取后。

试着重新考虑你的读者应该如何工作。尽量让他们更不可知关于价值的时代。如果这是根本不可能的,所有的写操作必须被捕获并处理,那么你可能被迫像将所有更具确定性方案的写入队列中,有读者出列他们一个接一个。我相信 concurrentqueue 类会在这种情况下帮助。

如果你可以的"新鲜"的意思减少只是"新的",然后把呼叫 thread.memorybarrier 每次读取之后,使用 volatile.read ,使用挥发性关键字等,将绝对保证一个读取序列中会返回价值超过previous读。


1 开辟了新的 aba问题可以蠕虫。

标签:新鲜担保挥发性



分享:

  • 微信
  • QQ好友
  • QQ空间
  • 新浪微博


热门推荐

OpenOffice和.NET(OpenOffice and .NET)

problem is there a .net api for openoffice edit: is the ...

VB.NET FileSystemWatcher的多个更改事件(VB.NET FileSystemWatcher Multiple Change Events)

problem i have the following code: imports system.io ...

光速VS NHibernate的(Lightspeed vs NHibernate)

problem what is the experience with lightspeedthe compari ...

实现在C#中的生产者/消费者模式(Implementing the Producer/Consumer Pattern in C#)

problem how can i implement the producer/consumer pattern ...

没有tnsnames.ora文件Oracle连接字符串(Oracle connection string without tnsnames.ora file)

problem i am using the .net framework with the system.dat ...

我如何可以访问WCF服务实例,在当前的背景下?(How do I get access to the WCF service instance in the current context)

problem if i am executing within the context of a particu ...

如何崩溃的.NET公共语言运行库(CLR)在纯.NET(How to crash the .NET common language runtime (CLR) in pure .net)

problem there is a similar question targeting the java vm ...

类/模型级别验证(而不是属性级别)? (ASP.NET MVC 2.0)(Class/Model Level Validation (as opposed to Property Level) (ASP.NET MVC 2.0))

problem basically, what the title says. i hav ...

为了避免出现InvalidOperationException最佳实践:集合已修改?(Best practice to avoid InvalidOperationException: Collection was modified)

problem very often i need something like that: foreach ...

为什么在C#4.0的可选参数需要编译时常?(Why do optional parameters in C# 4.0 require compile-time constants)

problem also is there a way to use run-time v ...

不能添加欣赏到EDMX(cannot add view to the edmx)

problem when trying to add a view to the edmx ...

目前已经在IP端点0.0.0.0:13000监听器。 ? (TCP使用WCF)(There is already a listener on IP endpoint 0.0.0.0:13000. (TCP using WCF))

problem i'm trying to figure out why the port is being us ...

这是使用System.Security.Principal.WindowsIdentity的合理的安全?(Is this use of System.Security.Principal.WindowsIdentity reasonably secure)

problem is system.security.principal.windowsidentity reas ...

C#拖放放大器;从列表框中下降到TreeView控件(C# Drag &amp; drop from listbox to treeview)

problem i have a winform with a listbox and a treeview. ...

C#检查远程服务器(C# Check Remote Server)

problem can anyone advise what the best way to check (usi ...

如何获取数字HTTP状态codeS在PowerShell中(How to obtain numeric HTTP status codes in PowerShell)

problem i know of a few good ways to build web clients in ...

反映从基类的私人领域(Reflecting a private field from a base class)

problem here is the structure: myclass : superclass2 su ...

除通过JavaScript来本地磁盘作为.png文件渲染SVG图像(Save svg image rendered by a javascript to local disk as .png file)

problem i am new to svg and not an advanced user of javas ...

单元测试System.Timers.Timer的(unit testing system.timers.timer)

problem i've been reading over the questions about unit t ...

为什么String.IsNullOrEmpty比string.length减得快?(Why is String.IsNullOrEmpty faster than String.Length)

problem ilspy shows that string.isnullorempty is implemen ...