问题标签 [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# 中的 Interlocked.Increment 之后检查溢出?
调用后检查溢出的正确方法是什么Interlocked.Increment
?
我有一个 ID 生成器,它在程序执行期间生成唯一 ID,目前我对其进行测试,增量返回零。
鉴于我每次运行生成的 ID 数量相当多,_counter
增加时可能会溢出(在异常大的输入上),我想在这种情况下抛出异常(尽早崩溃以简化调试)。
摘自微软的文档:
此方法通过包装处理溢出条件: if
location
=Int32.MaxValue
,location + 1
=Int32.MinValue
。不会抛出异常。
windows - 两个 CPU 内核上的 InterlockedExchange
我有一个 Windows 7 驱动程序,我想在其中同步对变量的访问。我可以使用 InterlockedExchange 吗?
我目前对 InterlockedExchange 的理解是,InterlockedExchange 是通过编译器内在函数完成的。这意味着,读取(InterlockedExchange 返回旧值)和写入在一个时钟周期内完成。仅当始终通过互锁函数访问变量时,互锁函数才是原子的。
但是在这种情况下会发生什么:
StatusVariable 在两个 CPU 内核上以相同的时钟周期写入。函数是否注意到变量被访问并将写入推迟到不同的时钟周期?还是未定义变量在写入后具有哪个值?变量是否也可能包含垃圾?
编辑:我在 x86 或 x64 上。
.net - (自定义)性能计数器的空间和时间消耗
就增加(自定义)性能计数器的速度而言,我理解性能计数器是无锁的处理器原语。我怀疑这意味着它们可以在几十个 CPU 周期内执行——这意味着它们非常快,几乎不可能进行基准测试。正确的?
关于创建自定义性能计数器的内存消耗,我从一位同事那里听说,每个计数器需要大约 128kb 或更多(来自全局共享或单独的共享内存)。我不敢相信这个数字。这没有什么意义。我也许可以相信 2k 到 8k,但我想知道是否有人对此有更准确的信息?
c# - 从列表中累积值的并行代码版本>
我再次努力理解并行计算的一些事情。在我正在处理的代码中,我有一个扩展list<list<double>>
. 在这个类中,我正在编写一个方法来返回list<list<double>>
. 此方法是私有的。
我有这个方法的两个版本,它们都可以工作。第一个版本是串行的:
第二个版本是并行的:
作为一个学习练习,我试图通过使用更复杂的并行线程来搞砸事情。我的想法是不使用对行求和的中间数组。具体来说,这是我的尝试(不起作用):
这个片段有(至少)两个错误。它给我的第一个错误是sub += this[i][j];
:
'System.Collections.Generic.List>.this[int]' 的最佳重载方法匹配有一些无效参数
我在这里不明白这个错误,因为 i 和 j 都是 int 类型。
然后我有一个进一步的错误Interlocked.CompareExchange(ref avg, tot+sub, tot);
(预期,因为我真的不明白这个方法是如何工作的):
当前上下文中不存在名称“sub”
有人可以指出最后一个片段的正确形式吗?和/或一些材料来澄清这些事情?我从http://msdn.microsoft.com/en-us/library/dd460703.aspx阅读,但它并没有帮助我弄清楚。
c# - 将 Interlocked.CompareExchange 同步与 Timer HandleElapsed 处理程序中的同步对象一起使用
我正在阅读 MSDN 示例http://msdn.microsoft.com/en-us/library/system.timers.timer.stop.aspx
在 timer.stop 示例中,我怀疑它使用 Interlocked.CompareExchange 的方式不正确。
我的问题是这个块
应该像
因为原始分配 syncPoint = 0;
不是线程安全的。我对吗?
更新:
我更新了这个例子,我对 ComareExchange 的返回值没有任何疑问,我的问题是关于这个 if 块末尾的变量同步点的分配。它根本没有联锁。
c# - Interlocked.CompareExchange 与枚举
我正在尝试使用Interlocked.CompareExchange
此枚举:
以下代码无法编译,但这就是我想要做的:
当然我可以使用 int 而不是 enum 并使用属性:
然后将枚举转换为 int:
但是有更好的方法来做到这一点吗?
c# - Interlocked 是如何工作的,为什么它比 lock 更快?
我刚刚了解到联锁类,它应该比简单的锁定更快。现在,这一切都很好,但我对实施感到好奇。
据我所知,确保对变量的操作以原子方式完成的唯一方法是确保在任何时候只有一个线程可以访问该变量。这是锁定。
我已经使用反射器来获取 Interlocked 的来源,但它似乎使用外部方法来完成所有工作:
我已经运行了一些测试,实际上 Interlocked 的速度是简单地锁定对象并增加它的两倍。
他们是怎么做到的?
c# - ConcurrentQueue one element is taken by two threads
I want two threads to be working with one queue. First thread should be called every 2 seconds, and the second thread - every 3 seconds. Both threads should start at the same time. I have a problem when accessing first element of the queue. Both threads take the element with index 0. Sometimes it happens with other elements of the queue, not only with the first element. I have such an output on Console:
- Item 0 processed by 1 Time: 3:27:8
- Item 0 processed by 2 Time: 3:27:8
- Item 2 processed by 1 Time: 3:27:10
- Item 3 processed by 2 Time: 3:27:11
- Item 4 processed by 1 Time: 3:27:12
and so on..
Here is the code I use:
c# - System.Threading.Timer 的奇怪行为
我试图深入了解 Timer 将如何使用线程池。我写了以下简单的片段。
令人惊讶的是,这是我得到的输出:
使用 14 个线程。10 使用 14 个线程。18 使用 14 个线程。28 使用 14 个线程。39 使用 14 个线程。48 使用 15 个线程。58 使用 15 个线程。69 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80 使用 15 个线程。80
无论我继续运行该过程多长时间,数据变量都保持在 80。
有谁知道为什么变量在前 8 次迭代中更新并且停止递增?
c# - 这是线程安全的吧?
只是检查..._count
正在安全访问,对吗?
这两种方法都由多个线程访问。