问题标签 [interlocked]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
918 浏览

c# - 这个 MSDN CompareExchange 示例如何不需要易失性读取?

我正在寻找一个线程安全的计数器实现,它使用Interlocked支持任意值递增的方式,并直接从Interlocked.CompareExchange文档中找到了这个示例(为简单起见稍作更改):

我知道这段代码试图做什么,但我不确定在分配给添加到的临时变量时如何不使用共享变量的易失性读取。

是否有机会initialValue在整个循环中保持陈旧的值,使函数永远不会返回?或者内存屏障(?)CompareExchange是否消除了任何这种可能性?任何见解将不胜感激。

编辑:我应该澄清一下,如果CompareExchange导致后续读取在上次totalValue调用时是最新的,那么这段代码就可以了。但这能保证吗? CompareExchange

0 投票
1 回答
1422 浏览

c# - C# 如何使用 Interlocked.CompareExchange

我的目标如下:

有一定范围的整数,我必须测试该范围内的每个整数是否随机。我想为此使用多个线程,并使用共享计数器在线程之间平均分配工作。我将计数器设置为起始值,让每个线程取一个数字,增加它,进行一些计算,然后返回一个结果。这个共享计数器必须用锁递增,否则在要测试的整数范围内会有间隙/重叠。

我不知道从哪里开始。假设我想要 12 个线程来完成这项工作,我会:

startThread()是我用于计算的方法。

你能帮我上路吗?我知道我必须使用 Interlocked 类,但仅此而已……。

0 投票
1 回答
2541 浏览

windows-xp - _InterlockedCompareExchange64 编译器内在 Windows XP 上?

根据 Microsoft 文档,InterlockedCompareExchange64 在 Windows Vista 之前不能作为 Windows API 调用使用。请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms683562(v=vs.85).aspx

但是,似乎 _InterlockedCompareExchange64 编译器内在函数可能在 Windows XP 上可用,只要您使用的是 Pentium 或更高版本的处理器:http: //msdn.microsoft.com/en-us/library/ttk2z1ws(VS.80)。 .aspx _

这个对吗?有什么问题吗?

0 投票
4 回答
2972 浏览

c++ - InterlockedExchange 和内存可见性

我已阅读文章同步和多处理器问题,并且对 InterlockedCompareExchange 和 InterlockedExchange 有疑问。这个问题实际上是关于文章中的最后一个例子。它们有两个变量iValuefValueHasBeenComputed并且在CacheComputedValue()它们中使用InterlockedExchange

我知道我可以InterlockedExchange用于修改iValue,但仅仅做就够了吗

那么真的有必要使用InterlockedExchange来设置iValue吗?或者其他线程将正确看到 iValue,即使iValue = ComputeValue();. 我的意思是其他线程会正确看到 iValue,因为它InterlockedExchange后面有。

还有论文A Principle-Based Sequential Memory Model for Microsoft Native Code Platforms。有一个 3.1.1 示例,其代码或多或少相同。推荐之一Make y interlocked。注意 - 不是两者yx

更新
只是为了澄清这个问题。问题是我看到了矛盾。“同步和多处理器问题”中的示例使用两个InterlockedExchange. 相反,在示例 3.1.1 “Basic Reodering”(我认为这与第一个示例非常相似)中,Herb Sutter 给出了这个建议

“使 y 互锁:如果 y 互锁,则 y 上没有竞争,因为它是原子可更新的,并且 x 上没有竞争,因为 a -> b -> d。”

. 在这个草稿草稿中,不要使用两个互锁的变量(如果我是对的,他的意思是InterlockedExchange仅用于y)。

0 投票
2 回答
1204 浏览

.net-4.0 - 如何对 .Net 中的内存映射文件使用互锁操作

有没有办法对存储在内存映射文件中的值使用Interlocked.CompareExchange();and方法?Interlocked.Increment();

我想实现一个多线程服务,它将其数据存储在内存映射文件中,但由于它是多线程的,我需要防止写入冲突,因此我想知道互锁操作而不是使用显式锁。

我知道可以使用本机代码,但是可以在 .NET 4.0 上的托管代码中完成吗?

0 投票
2 回答
2173 浏览

c# - 并行编程联锁 C#

我对这个例子感到困惑

http://msdn.microsoft.com/en-us/library/dd997393.aspx

我不知道为什么最后一个委托(finalResult) => Interlocked.Add(ref total,finalResult) 需要互锁,而前面的表达式

才不是?

谢谢

0 投票
2 回答
756 浏览

c# - 从多个线程读取/写入的字段,互锁与易失

在 SO 上有很多关于Interlockedvs. volatilehere 的问题,我理解并知道volatile(不重新排序,总是从内存中读取等)的概念,并且我知道Interlocked它是如何执行原子操作的。

但我的问题是这样的:假设我有一个从多个线程读取的字段,它是某种引用类型,比如说:public Object MyObject;。我知道,如果我对它进行比较交换,如下所示:Interlocked.CompareExchange(ref MyObject, newValue, oldValue)互锁保证只写入引用newValue的内存位置ref MyObject,如果ref MyObjectoldValue当前引用同一个对象。

但是阅读呢?是否Interlocked保证操作成功MyObject后读取的任何线程CompareExchange都会立即获得新值,还是我必须标记MyObjectvolatile确保这一点?

我想知道的原因是我已经实现了一个无锁链表,当你向它添加一个元素时,它会不断更新自身内部的“头”节点,如下所示:

现在Prepend成功后,是否保证读取的线程head获得最新版本,即使它没有标记为volatile

我一直在做一些实证测试,它似乎工作正常,我在这里搜索过但没有找到明确的答案(一堆不同的问题和评论/答案都说相互矛盾的事情)。

0 投票
2 回答
4981 浏览

windows - 为什么 InterlockedCompareExchange 不返回更改的值?

返回值
该函数返回 Destination 参数的初始值。

只是好奇。
为什么 InterlockedCompareExchange 返回初始值?他们这样设计有什么原因吗?

0 投票
4 回答
2311 浏览

c# - Windows 服务中的可重入计时器

我想构建一个 Windows 服务,它应该在不同的时间执行不同的方法。它根本与准确性无关。我使用 system.timers.timer,并使用计数器调节要在 Eventhandler 方法中执行的不同方法。到目前为止一切正常。

所有方法都在访问 COM 端口,因此必须一次仅授予一种方法的访问权限。但是由于这些方法可能需要一些时间才能完成,因此计时器可能会再次计时并希望在 COM 端口仍被占用时执行另一个方法。在这种情况下,事件可以而且应该被解雇。

简化为一种方法,我的 elapsedEventHandler 方法如下所示(try-catch 和此处排除的不同方法)

注意:虽然这在我的 Win7 x64 上运行良好,但在安装了几乎完全相同的软件的 Win7 x86 机器上,每当要执行的方法需要很长时间时,它都会遇到困难。计时器不会再滴答作响,不会抛出异常。没有什么!我现在的问题是:我是否在做访问控制和计时器的部分,以便我可以专注于其他事情?我只是不太熟悉计时器,尤其是线程

非常感谢您!
任何帮助是极大的赞赏!

0 投票
1 回答
1205 浏览

c++ - InterlockedExchange Visual Studio 2010 内在

我在编译器的优化设置中启用了内在函数,但是,InterlockedExchange 的生成代码正在生成对 kernel32.dll 的调用,而不是生成内联程序集。这尤其成问题,因为该功能在 Vista 之前的 Windows 版本上不可用。

MSDN 文档指出“此功能是在可能的情况下使用编译器内在实现的”。是否可以让编译器使用 InterlockedExchange 的实际内在代码?