问题标签 [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# - 易失性与互锁性与锁定性
假设一个类有一个public int counter
由多个线程访问的字段。这int
只是增加或减少。
要增加这个字段,应该使用哪种方法,为什么?
lock(this.locker) this.counter++;
,Interlocked.Increment(ref this.counter);
,- 将访问修饰符更改为
counter
topublic volatile
。
现在我发现了volatile
,我一直在删除许多lock
语句和Interlocked
. 但是有理由不这样做吗?
c# - Interlocked 是否在所有线程中提供可见性?
假设我有一个变量“counter”,并且有多个线程使用 Interlocked 访问和设置“counter”的值,即:
和
我可以假设,Interlocked 所做的更改将在所有线程中可见吗?
如果没有,我应该怎么做才能让所有线程同步变量?
编辑:有人建议我使用 volatile。但是当我将“计数器”设置为 volatile 时,会出现编译器警告“对 volatile 字段的引用不会被视为 volatile”。
当我阅读在线帮助时,它说:“通常不应使用 ref 或 out 参数传递 volatile 字段”。
c++ - 互锁增量用法
在阅读InterlockedIncrement函数时,我看到了传递的变量必须在 32 位边界上对齐的注释。通常我见过这样使用 InterlockedIncrement 的代码:
上面的代码在多处理器系统中是否正常工作,还是我应该多加注意?
c++ - 读取互锁变量
认为:
A. WIN32下的C++。
B. 使用InterlockedIncrement()
和递增和递减的正确对齐的易失性整数InterlockedDecrement()
。
如果我只想读取_ServerState,是否需要通过InterlockedXXX
函数读取变量?
例如,我见过如下代码:
和
目标是简单地读取 的当前值_ServerState
。
我不能简单地说:
WRT这个主题似乎有些混乱。我知道寄存器大小的读取在 Windows 中是原子的,所以我认为该InterlockedXXX
函数是不必要的。
马特·J。
好的,谢谢回复。顺便说一句,这是 Visual C++ 2005 和 2008。
如果这是真的,我应该使用一个InterlockedXXX
函数来读取 的值_ServerState
,即使只是为了清楚起见,最好的方法是什么?
这具有修改值的副作用,而我真正想做的就是读取它。不仅如此,如果有上下文切换,我可能会将标志重置为错误的值,因为 的值_ServerState
被压入堆栈以准备调用InterlockedExchange()
.
我从我在 MSDN 上看到的一个例子中得到了这个。
请参阅http://msdn.microsoft.com/en-us/library/ms686355(VS.85).aspx
我所需要的只是一些类似的东西:
无论如何,我认为很清楚的一点是提供对标志的线程安全访问,而不会产生关键部分的开销。我已经看到通过函数族以这种方式使用 LONG InterlockedXXX()
,因此我提出了问题。
好的,我们正在考虑一个很好的解决这个读取当前值问题的方法是:
c# - 是否可以使用无锁(等待)双向链表?
用 C# 标签问这个问题,但如果可能的话,应该可以用任何语言。
是否可以使用互锁操作实现双向链表以提供无等待锁定?我想插入、添加和删除,无需等待即可清除。
multithreading - InterlockedExchange 和内存对齐
我很困惑微软说 InterlockedExchange 需要内存对齐,但是英特尔文档说 LOCK 不需要内存对齐。我错过了什么,还是什么?谢谢
来自 Microsoft MSDN 库
平台 SDK:DLL、进程和线程 InterlockedExchange
Target 参数指向的变量必须在 32 位边界上对齐;否则,此函数在多处理器 x86 系统和任何非 x86 系统上的行为将无法预测。
来自英特尔软件开发人员手册;
LOCK 指令 使处理器的 LOCK# 信号在伴随指令的执行期间被断言(将指令变成原子指令)。在多处理器环境中,LOCK# 信号确保处理器在信号被断言时独占使用任何共享内存。
LOCK 前缀的完整性不受内存字段对齐的影响。 对于任意未对齐的字段,会观察到内存锁定。
P6 和更新的处理器系列中的内存排序
锁定指令有一个总顺序。
软件控制总线锁定
总线锁的完整性不受内存字段对齐的影响。LOCK 语义遵循更新整个操作数所需的尽可能多的总线周期。但是,建议锁定访问在其自然边界上对齐以获得更好的系统性能: • 8 位访问的任何边界(锁定或其他)。•锁定字访问的16 位边界。• 锁定双字访问的32 位边界。• 锁定四字访问的64 位边界。
thread-safety - 对未对齐数据的联锁操作
win32 互锁函数为数据的原子操作提供了一种机制。它们应该是线程安全的和多处理器安全的。
如果数据没有对齐会发生什么?联锁操作仍然是原子的?例如:增加一个未对齐的整数。
泰
.net - Interlocked.Increment 的性能
在各种平台上Interlocked.Increment(ref x)
比整数和长整数更快还是更慢?x++
multithreading - InterlockedRead 在哪里?
Win32 api 有一组 InterlockedXXX 函数来原子地和同步地操作简单的变量,但是似乎没有任何 InterlockedRead 函数来简单地检索变量的值。怎么来的?
对正确对齐的 32 位变量的简单读写是原子操作
但补充说:
但是,不能保证访问是同步的。如果两个线程正在读取和写入同一个变量,则无法确定一个线程是否会在另一个线程执行其写入操作之前执行其读取操作。
这意味着,据我了解,一个变量的简单读取操作可以发生,而另一个,比如说,InterlockedAdd 操作已经到位。那么为什么没有联锁函数来读取变量呢?
我猜这个值可以被读取为 InterlockedAdd-ing 零的结果,但这似乎不是正确的方法。
c# - C# 互锁交换
我的游戏有点像这样:
我想将 Time 更改为 Uint32;但是,当我尝试使用UInt32
而不是float
值时,它会抗议该类型必须是引用类型。Float
不是引用类型,所以我知道在技术上可以使用非引用类型来做到这一点。有什么实用的方法可以使它起作用UInt32
吗?