问题标签 [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++ - InterlockedExchange 与 InterlockedExchangePointer
InterlockedExchange
和 和有什么不一样InterlockedExchangePointer
?
是
和
相等的?
我必须将代码移植到不知道这些Interlocked[...]Pointer
功能的 VC6 上。
编辑:
根据我自己的经验,我知道 VC6漏洞百出,不会有人再使用它了。
但是,我不是决策者,对原始问题的回答将不胜感激。
c# - 在多线程环境中使用 Interlocked.Decrement 以及 monitor.wait 和 monitor.pulse 时的错误行为
我正在尝试实现一个多线程库,该库将使用线程池运行同时任务。基本上,它会从它接收的集合参数中将任务添加到线程池,然后等待直到正在处理的最后一个任务发送脉冲信号。我在早期的测试中取得了成功,但是当我想测试那些处理时间很短的任务时遇到了一个奇怪的问题。不知何故,要么在主线程中执行等待命令之前发送脉冲信号,要么正在发生其他事情,无论我为同步所做的努力如何,我都无法简单地看到。
为了解决我的问题,我实施了另一个“不太理想”的解决方案,因为我正在权衡潜在的性能优势,目前效果很好,但想知道为什么我的第一种方法在这种情况下不起作用尽管在性能方面排名第一,但两者之间并没有太大区别。
为了说明,我在简化以下流程后添加了这两种解决方案。有人可以帮我指出出了什么问题吗?
提前致谢。
algorithm - Diffe Hellman 和 Rivest Shamir 联锁协议?
因此,Diffe Hellman 受到 MITM 攻击,两方交换:
X = g^x mod n 和 Y = g^y mod n。
现在大概可以通过使用 Rivest Shamir 互锁协议来防止这种情况,我们将消息分成两部分并逐位交换它们。我想知道的是我们如何将 g^x mod n 分成两部分以便与 Rivest Shamir 一起使用?
multithreading - 使用 interlocked.CompareExchange 扩展 Interlocked.Add 作为 Interlocked.add(ref float,ref float)
你可以调用 add 像'Interlocked.Add(ref int32,int32) 或 Interlocked.Add(ref int64,int64)'
我这样称呼它:InterlockedEx.Add(ref subtotalVolume[i], v.Volume);
谁能给个建议,让它运行正常。
该函数的结果不等于正常函数(不使用 TPL)。
c++ - 为什么 InterlockedAdd 在 vs2010 中不可用?
我已经包含 windows.h 并想在 vs2010 中使用 InterlockedAdd 并编译错误“找不到标识符”,但InterlockedIncrement
可以正常工作。我尝试使用:
并编译错误:
警告 C4163:“_InterlockedAdd”:不能作为内部函数使用
1>test10.cpp(107):错误 C3861:“InterlockedAdd”:找不到标识符
代码有什么问题?
c# - 为什么每个人都说 SpinLock 更快?
我在互联网上阅读了很多文档、文章和帖子。几乎所有人和任何地方都认为 SpinLock 对于运行较短的代码片段更快,但我做了一个测试,在我看来,简单的 Monitor.Enter 比 SpinLock.Enter 工作得更快(测试是针对 .NET 4.5 编译的)
在具有 24 个 2.5 GHz 内核的服务器上,此应用程序使用 x64 编译产生以下结果:
css - 如何互锁div?
我想从这里互锁未定义数量的 div(如在 Pinterest 中):
对此:
CSS或其他东西有可能吗?
c# - 从 Interlocked 变量中读取最新值,仅对变量进行一次写入
我想用两种方法创建一个类:
void SetValue(T value)
存储一个值,但只允许存储一个值(否则它会引发异常)。T GetValue()
检索值(如果还没有值则抛出异常)。
我有以下愿望/限制:
- 读取值应该很便宜。
- 写入值可能(适度)昂贵。
GetValue()
仅当最新值不存在时才应抛出异常 (null
):它不应null
在调用SetValue()
另一个线程后基于陈旧值抛出异常。- 该值只写入一次。这意味着
GetValue()
如果它不为空,则不需要更新该值。 - 如果可以避免完整的内存屏障,那么它(好多)更好。
- 我知道无锁并发更好,但我不确定这里是否是这种情况。
我想出了几种方法来实现这一点,但我不确定哪些是正确的,哪些是有效的,为什么它们是(不)正确和(低)效率的,以及是否有更好的方法来实现我想要的。
方法一
- 使用非易失性字段
- 用于
Interlocked.CompareExchange
写入字段 Interlocked.CompareExchange
用于从字段中读取- 这依赖于(可能是错误的)假设,即在
Interlocked.CompareExchange(ref v, null, null)
对字段执行操作后将导致下一次访问获得的值至少与所Interlocked.CompareExchange
看到的值一样新。
编码:
方法二
- 使用
volatile
字段 - 使用 Ìnterlocked.CompareExchange
to write the value (with [Joe Duffy](http://www.bluebytesoftware.com/blog/PermaLink,guid,c36d1633-50ab-4462-993e-f1902f8938cc.aspx)'s
#pragmato avoid the compiler warning on passing a volatile value by
ref`)。 - 直接读取值,因为字段是
volatile
编码:
方法三
- 使用非易失性字段。
- 写入时使用锁。
- 如果我们读取 null,则在读取时使用锁(因为引用是原子读取的,我们将在锁外获得一致的值)。
编码:
方法四
- 使用 volatile 字段
- 使用锁写入值。
- 直接读取值,因为该字段是易失的(即使我们不使用锁,我们也会得到一个一致的值,因为引用是原子读取的)。
编码:
其他方法
我还可以Thread.VolatileRead()
结合任何写作技巧来读取值。
c# - 可以在终结器中使用 Interlocked 吗?
假设我需要在终结器中清理一些托管资源,或者至少以需要清理的线程安全方式将其记录在某处。据我了解,在终结器中使用锁是严格禁止的,但是 Interlocked 类呢?这安全吗,不会导致死锁吗?
此外,似乎所有终结器都在一个线程上运行,这是有保证的行为还是只是实现细节?如果这只是一个细节,那么在终结器中获取锁(例如,将作业推送到无锁队列中)是否可以,前提是该锁永远不会被其他任何地方使用?
c++11 - InterlockedCompareExchange16 的 C++ 短枚举问题(使用 VS2012)
引用了这个问题:可以将枚举类转换为基础类型吗?.
在我的代码中,我有效地:
然后我写 atypedef
和 a static_assert
:
最后我尝试设置状态InterlockedCompareExchange16
:
我从 VS2012 收到以下错误:
我的
static_assert
失败抱怨state_type
与大小不一样short
抱怨它
static_cast
不能从volatile STATE *
到state_type *
请任何人都可以给我任何关于如何最好地修复我的代码的指示吗?