gpt4 book ai didi

c# - 使用 .NET 中的 Interlocked 类实现按位运算

转载 作者:太空狗 更新时间:2023-10-29 19:46:49 25 4
gpt4 key购买 nike

我试图在多线程 .NET 应用程序中的共享变量中设置位标志,但找不到与 native 并行的 InterlockedOr托管中的功能 Interlocked类(class)。我想出了以下执行 |= 赋值的代码,但无限循环的理论上的可能性让我感到不舒服:

long currentValue;
long updatedValue;

do
{
// Spin until successful update. Value must be read using Interlocked.Read()
// to be truly atomic on 32 bit systems (see MSDN).
currentFlags = Interlocked.Read(ref _currentFlags);
updatedValue = currentFlags | flag;
} while (currentFlags != Interlocked.CompareExchange(ref _currentFlags, updatedValue, currentFlags));

这是否可以仅使用 Interlocked 类中内置的函数以更安全的方式实现?如果可能,我想避免涉及显式锁定的解决方案。

最佳答案

让我们假设(这些限制不是基本的,只是为了简化说明)

  • 开头currentFlags0 ,
  • 我们一步最多设置一个标志,
  • 我们不碰符号位。

请注意,如果我们设置位 k1currentFlags 一次,我们可以替换or+ 1L << k .所以我们可以使用辅助数组 set记住哪些位已经设置,然后执行 Interlocked.Add如果需要的话。

long currentFlags = 0;
int[] set = new int[sizeof(long) * 8];

....

int k = ...; // bit to set
if(Interlocked.Exchange(ref set[k], 1) == 0)
Interlocked.Add(ref currentFlags, 1L << k);

关于c# - 使用 .NET 中的 Interlocked 类实现按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31656978/

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