作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有多个线程访问变量。我知道如何编写自旋锁并使用 Threading.Interlocked 方法来递增等变量。
但是,我想执行相当于:
a = Math.Min(a, b)
or
a = a | 10
...但不使用临界区。这可能吗?我知道第二行在汇编程序中是可能的,但是没有 Interlocked.Or 方法。
最佳答案
这是模拟联锁操作的一般模式。
public static T InterlockedOperation<T>(ref T location, T value)
{
T initial, computed;
do
{
initial = location;
computed = op(initial, value); // initial | value
}
while (Interlocked.CompareExchange(ref location, computed, initial) != initial);
return computed;
}
最小操作是一个完全不同的故事。这里的问题是有两个内存位置在起作用。此外,我们只对阅读它们感兴趣。这意味着我们真的只需要担心内存屏障问题。用 volatile
装饰你的田地或者显式调用 Thread.MemoryBarrier
在计算最小值之前。
编辑:我忽略了一个事实,即 min 操作的结果分配给了 a
。 .你实际上可以使用我上面定义的模式,而不是做 computed = initial | value
做 computed = initial < value ? initial : value
.其他一切都保持不变。
关于.net - 如何在不使用锁的情况下在 .Net 中设置最小值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3731088/
我是一名优秀的程序员,十分优秀!