问题标签 [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.
c# - C# 从根本上不是可移植的?
我使用 C# 已经有一段时间了,最近开始致力于为我的一个副项目添加并行性。因此,根据微软的说法,对整数甚至浮点数的读写都是原子的
我确信这些原子性要求在 x86 架构上运行得很好。但是,在诸如 ARM(可能不支持硬件浮点)之类的架构上,这些保证似乎很难。
仅由于“int”始终为 32 位这一事实,问题才变得更加重要。有许多嵌入式设备不能原子地执行 32 位写入。
这似乎是 C# 中的一个基本错误。保证这些数据类型的原子性不能移植。
这些原子性保证如何在没有 FPU 或 32 位写入的架构上实现?
c++ - Win32 上的互锁操作与 XXX::atomic
在Win32平台上使用Interlocked winapi函数代替任何提供原子操作的库有什么优缺点?
便携性不是问题。
c# - 混合锁和联锁操作是否安全?
我有一些代码必须是线程安全的,其行为类似于:
计算必须同时锁定值和计数器,否则竞争条件可能会影响 if(...) 块,但是它们在被读出时根本不需要同步,即如果计数器和值在尝试阅读两者,这对我来说是 100% 好的。
读取时的互锁用于 64 位值的线程安全读取。
像这样混合联锁和锁安全吗?我在其他网页上读到混合它们是不安全的,但是如果这意味着混合它们是引入细微错误的好方法,或者如果在系统级别这会破坏所涉及的数据结构,我无法找到澄清。
所有这些互锁(64 位 .NET 4.0 运行时)的成本是否完全违背了在属性 get() 方法周围保存 ReaderWriterSlim 锁的目的?
c# - 非常奇怪和严重的多线程不一致问题c#
我有一个非常简单的看门狗程序,有 2 个线程。一个线程正在更新一个长变量,另一个线程读取该变量。并在距离上次更新超过 X 秒时发出警报。问题是有时(每天或多或少发生一次)第二个线程读取变量的陈旧值。
有时它是 3 秒前的旧值(即第一个线程更新了 long 变量,但 3 秒后另一个线程没有得到新值)
我正在使用锁,以避免多线程缓存问题。我还尝试了 Volatile、Interlock、volatileRead 等,但没有任何帮助。该课程通过 VB 6 程序通过 COM 启动。该程序非常简单,所以我认为这是 C# 中的一个错误(可能与 COM 相关)。这是程序:
你能帮忙吗?
c# - 无符号互锁读取
Interlocked.Read() 仅针对 Int64 而不是针对 UInt64 定义的原因是什么?我不会认为这两种类型之间有任何区别。
c# - 第一个进入的线程如何向其他并发线程发出相同方法结束的信号?
第一个进入的线程如何向其他并发线程发出相同方法结束的信号?
我有一个名为 PollDPRAM() 的方法。它必须通过网络访问一些慢速硬件并刷新对象私有数据。如果相同的方法被其他线程同时调用,它们一定不能执行此行程,而是等待第一个到来的线程完成工作并简单地退出,因为数据是新鲜的(比如 10-30 毫秒前没有区别) . 在不先进入第二、第三等线程的方法中很容易检测到。我使用联锁计数器来检测并发性。
问题:我通过观察计数器 (Interlocked.Read) 来检测第一个线程的退出是一个糟糕的选择,以便在计数器减少到小于在 n>1 线程入口处检测到的值之后进行观察。选择很糟糕,因为第一个线程在离开后几乎可以立即重新进入该方法。所以 n>1 线程永远不会检测到计数器的下降。
所以问题:如何正确检测第一个进入的线程已经退出方法,即使这个第一个线程可以立即再次进入它?
谢谢
PS 一段代码
java - 可以创建可以原子交换的 AtomicReference 吗?
有没有办法实现一种引用类型,其值可以与另一个原子交换?
在 Java 中,我们AtomicReference
可以将其与局部变量交换,但不能与另一个AtomicReference
.
你可以做:
并通过两种操作的组合交换它们:
但这使它们之间处于不一致的状态,两者都包含"hello"
. 此外,即使您可以原子地交换它们,您仍然无法原子地读取它们(作为一对)。
我想做的是:
然后
交换值,并在另一个线程中:
并确保输出为[hello, world]
或[world, hello]
。
笔记:
r1
并r2
为此操作配对,但另一个线程可能会独立配对,比如说r1
和另一个r3
(不幸的是,这意味着我不能使用这个解决方案。)- 将有数十万个这样的引用,因此全球
ReentrantLock
将是一个主要瓶颈。 rp
并且otherRP
不一定在线程之间共享,因此简单地锁定它们是行不通的。他们可以被实习,但实习池需要自己的同步,这将是另一个瓶颈。- 我在这里只做了 2 组参考,但是能够组合 3 组或更多组将是一个奖励。
是否可以实现的无锁版本AtomicRefPair
?我有一种预感,但如果不是,那么也许某处有一篇文章解释了原因?
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 中)有什么好处?
c++ - WinAPI _Interlocked* char 的内部函数,短
我需要在 char 或 short 上使用 _Interlocked*** 函数,但它需要 long 指针作为输入。似乎有函数_InterlockedExchange8,我没有看到任何文档。看起来这是未记录的功能。编译器也找不到 _InterlockedAdd8 函数。我将不胜感激有关该功能的任何信息,使用/不使用的建议以及其他解决方案。
更新 1
我会尽量简化这个问题。我怎样才能使这项工作?
我看到了两种可能的解决方案
- 利用
_InterlockedExchange8
- 转换
another
为 long,进行交换并将结果转换回 X
第一个显然是不好的解决方案。第二个看起来更好,但是如何实现呢?
更新 2
你怎么看这样的事情?
谢谢。
.net - lock() 在这里有意义吗?
我有一个简单的类,例如:
,一个用于设置值的线程和多个读取值的线程。因此,可以使用lock()
使所有读取和写入不间断。但我知道同步永远不会实现,总是有Val1 - Val2
可能不等于Delta
我不太关心的机会。我更关心的是通过 getter 获得稳定的值。然而lock()
,这种情况是昂贵的,因为大多数读者都会工作。
我想到的下一个最好的事情是使用Interlocked.Exchange()
但是代码对我来说似乎很愚蠢。我不知道。
那么lock()
有意义吗?我应该使用Interlocked.Exchange()
性能增益吗?或者我还能做什么?