问题标签 [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 投票
5 回答
3711 浏览

c# - C# 从根本上不是可移植的?

我使用 C# 已经有一段时间了,最​​近开始致力于为我的一个副项目添加并行性。因此,根据微软的说法,对整数甚至浮点数的读写都是原子的

我确信这些原子性要求在 x86 架构上运行得很好。但是,在诸如 ARM(可能不支持硬件浮点)之类的架构上,这些保证似乎很难。

仅由于“int”始终为 32 位这一事实,问题才变得更加重要。有许多嵌入式设备不能原子地执行 32 位写入。

这似乎是 C# 中的一个基本错误。保证这些数据类型的原子性不能移植。

这些原子性保证如何在没有 FPU 或 32 位写入的架构上实现?

0 投票
3 回答
1736 浏览

c++ - Win32 上的互锁操作与 XXX::atomic

在Win32平台上使用Interlocked winapi函数代替任何提供原子操作的库有什么优缺点?

便携性不是问题。

0 投票
1 回答
1461 浏览

c# - 混合锁和联锁操作是否安全?

我有一些代码必须是线程安全的,其行为类似于:

计算必须同时锁定值和计数器,否则竞争条件可能会影响 if(...) 块,但是它们在被读出时根本不需要同步,即如果计数器和值在尝试阅读两者,这对我来说是 100% 好的。

读取时的互锁用于 64 位值的线程安全读取。

  1. 像这样混合联锁和锁安全吗?我在其他网页上读到混合它们是不安全的,但是如果这意味着混合它们是引入细微错误的好方法,或者如果在系统级别这会破坏所涉及的数据结构,我无法找到澄清。

  2. 所有这些互锁(64 位 .NET 4.0 运行时)的成本是否完全违背了在属性 get() 方法周围保存 ReaderWriterSlim 锁的目的?

0 投票
2 回答
412 浏览

c# - 非常奇怪和严重的多线程不一致问题c#

我有一个非常简单的看门狗程序,有 2 个线程。一个线程正在更新一个长变量,另一个线程读取该变量。并在距离上次更新超过 X 秒时发出警报。问题是有时(每天或多或少发生一次)第二个线程读取变量的陈旧值。

有时它是 3 秒前的旧值(即第一个线程更新了 long 变量,但 3 秒后另一个线程没有得到新值)

我正在使用锁,以避免多线程缓存问题。我还尝试了 Volatile、Interlock、volatileRead 等,但没有任何帮助。该课程通过 VB 6 程序通过 COM 启动。该程序非常简单,所以我认为这是 C# 中的一个错误(可能与 COM 相关)。这是程序:

你能帮忙吗?

0 投票
1 回答
401 浏览

c# - 无符号互锁读取

Interlocked.Read() 仅针对 Int64 而不是针对 UInt64 定义的原因是什么?我不会认为这两种类型之间有任何区别。

0 投票
3 回答
488 浏览

c# - 第一个进入的线程如何向其他并发线程发出相同方法结束的信号?

第一个进入的线程如何向其他并发线程发出相同方法结束的信号?

我有一个名为 PollDPRAM() 的方法。它必须通过网络访问一些慢速硬件并刷新对象私有数据。如果相同的方法被其他线程同时调用,它们一定不能执行此行程,而是等待第一个到来的线程完成工作并简单地退出,因为数据是新鲜的(比如 10-30 毫秒前没有区别) . 在不先进入第二、第三等线程的方法中很容易检测到。我使用联锁计数器来检测并发性。

问题:我通过观察计数器 (Interlocked.Read) 来检测第一个线程的退出是一个糟糕的选择,以便在计数器减少到小于在 n>1 线程入口处检测到的值之后进行观察。选择很糟糕,因为第一个线程在离开后几乎可以立即重新进入该方法。所以 n>1 线程永远不会检测到计数器的下降。

所以问题:如何正确检测第一个进入的线程已经退出方法,即使这个第一个线程可以立即再次进入它?

谢谢

PS 一段代码

0 投票
2 回答
2207 浏览

java - 可以创建可以原子交换的 AtomicReference 吗?

有没有办法实现一种引用类型,其值可以与另一个原子交换?


在 Java 中,我们AtomicReference可以将其与局部变量交换,但不能与另一个AtomicReference.

你可以做:

并通过两种操作的组合交换它们:

但这使它们之间处于不一致的状态,两者都包含"hello". 此外,即使您可以原子地交换它们,您仍然无法原子地读取它们(作为一对)。


我想做的是:

然后

交换值,并在另一个线程中:

并确保输出为[hello, world][world, hello]

笔记:

  • r1r2为此操作配对,但另一个线程可能会独立配对,比如说r1和另一个r3(不幸的是,这意味着我不能使用这个解决方案。)
  • 将有数十万个这样的引用,因此全球ReentrantLock将是一个主要瓶颈。
  • rp并且otherRP不一定在线程之间共享,因此简单地锁定它们是行不通的。他们可以被实习,但实习池需要自己的同步,这将是另一个瓶颈。
  • 我在这里只做了 2 组参考,但是能够组合 3 组或更多组将是一个奖励。

是否可以实现的无锁版本AtomicRefPair?我有一种预感,但如果不是,那么也许某处有一篇文章解释了原因?


相关如何在 C# 中原子交换 2 个整数?

0 投票
2 回答
1061 浏览

c++ - 具有获取和释放语义的联锁操作(多平台)

编辑:好的,我有一个具体的问题。我想用获取和释放语义(伪代码)实现“交换”功能:

问题是:我不知道如何实现它。我正在使用 Microsoft 的 Visual Studio 2010 在 Windows 下进行开发。当然,有“intrin.h”和“Windows.h”可以提供这些功能/内在函数。但是 InterlockedIncrementAcquire 只是 InterlockedIncrement 的定义,并提供了完整的内存屏障。这不是我所追求的。

/ * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *** 原帖:/** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *

我想写一个像 C++0x std::atomic 这样的原子类。我只是想确定我的想法是否正确。

我想实现以下代码: EDIT (replaced bad implementation)

有什么我缺少的吗,或者这是一个“好”的非常好的实现。

感谢您的任何评论。此致:

PS:我不想为此提出一个新问题:使用 boost::uint32_t(在 boost\cstdint.h 中)而不是 uint32_t(在 stdint.h 中)有什么好处?

0 投票
4 回答
703 浏览

c++ - WinAPI _Interlocked* char 的内部函数,短

我需要在 char 或 short 上使用 _Interlocked*** 函数,但它需要 long 指针作为输入。似乎有函数_InterlockedExchange8,我没有看到任何文档。看起来这是未记录的功能。编译器也找不到 _InterlockedAdd8 函数。我将不胜感激有关该功能的任何信息,使用/不使用的建议以及其他解决方案。

更新 1

我会尽量简化这个问题。我怎样才能使这项工作?

我看到了两种可能的解决方案

  1. 利用_InterlockedExchange8
  2. 转换another为 long,进行交换并将结果转换回 X

第一个显然是不好的解决方案。第二个看起来更好,但是如何实现呢?

更新 2

你怎么看这样的事情?

谢谢。

0 投票
3 回答
184 浏览

.net - lock() 在这里有意义吗?

我有一个简单的类,例如:

,一个用于设置值的线程和多个读取值的线程。因此,可以使用lock()使所有读取和写入不间断。但我知道同步永远不会实现,总是有Val1 - Val2可能不等于Delta 我不太关心的机会。我更关心的是通过 getter 获得稳定的值。然而lock(),这种情况是昂贵的,因为大多数读者都会工作。

我想到的下一个最好的事情是使用Interlocked.Exchange()

但是代码对我来说似乎很愚蠢。我不知道。

那么lock()有意义吗?我应该使用Interlocked.Exchange()性能增益吗?或者我还能做什么?