gpt4 book ai didi

.net - 如何在不使用锁的情况下在 .Net 中设置最小值?

转载 作者:行者123 更新时间:2023-12-01 13:05:01 24 4
gpt4 key购买 nike

我有多个线程访问变量。我知道如何编写自旋锁并使用 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 | valuecomputed = initial < value ? initial : value .其他一切都保持不变。

关于.net - 如何在不使用锁的情况下在 .Net 中设置最小值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3731088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com