问题标签 [interlocked-increment]
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#:使用 Interlocked 来统计委托的调用次数是否正确?
我正在玩,Interlocked.Increment
想知道哪个呼叫计数器 impl。下面(基本上得到给定委托的调用次数)在高度并发的环境中正确地完成了它的工作(即线程安全)。
c# - 可以在这个多线程循环实现中正确使用 Interlocked CompareExchange 吗?
由于多线程上下文中的某些速率限制,我需要在 N 个不同连接之间循环一些调用。我决定使用一个列表和一个“计数器”来实现这个功能,它应该在每次调用的实例之间“跳一个”。
我将用一个最小的例子来说明这个概念(使用一个名为 A 的类来代表连接)
这按预期工作,因为它确保调用在连接之间是循环的。我可能会在“真实”代码中坚持这个实现(计数器使用 long 而不是 int)
但是,即使在我的用例中不太可能达到 int.MaxValue ,我想知道是否有办法“安全地溢出”计数器。
我知道 C# 中的“%”是“余数”而不是“模数”,这意味着一些 ?: 体操需要始终返回正数,这是我想避免的。
所以我想提出的是:
我期望的是Interlocked.CompareExchange(ref crt, 0, itemsCount)
只有一个线程“赢得”,一旦达到可用连接数,将计数器设置回 0。但是,我不知道如何在这种情况下使用它。
可以在这里使用 CompareExchange 或 Interlocked 中的其他机制吗?
vba - VBA kernel32 InterlockedIncrement 在 64 位主机中不可用,我该怎么办?
我正在将一些代码从 32 位 VBA 升级到 64 位 VBA。它使用 InterlockedIncrement 函数:
这以前由 kernel32 导出,但仅适用于 x86 调用者。从 64 位 Excel 运行它不是那么简单,我得到一个“在 kernel32 中找不到 DLL 入口点 InterlockedIncrement ”错误 -这就是我发现的原因:
在 64 位窗口上,这些不是真正的函数 [...] 它们是编译器内在函数。P/Invoking 该函数的代码应该使用 Interlocked 托管类
有什么好的选择/我可以解决这个问题吗?
对于上下文,我正在从这个答案中更新代码,其中 InterlockedIncrement 和 InterlockedDecrement 用于进行 COM 引用计数。现在我明白这些互锁函数是对多线程很重要的原子操作,但是由于 VBA 在单线程单元中运行,我什至需要打扰吗?是否this.refCount = this.refCount + 1
足够?代码略高于我的头脑,所以我不能 100% 确定我不会因为忘记这些功能而引入错误,但无论哪种方式都让我知道。