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

Cry*_*vat 8 .net c# multithreading bit-manipulation interlocked

我正在尝试在多线程.NET应用程序中的共享变量中设置位标志,但无法找到与托管的Interlocked类中的本机InterlockedOr函数的并行.我已经提出了以下用于执行| =赋值的代码,但无限循环的理论可能性让我感到不舒服:

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));
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*exD 1

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

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

请注意,如果我们将 bit 设置k1incurrentFlags 一次,我们可以替换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);
Run Code Online (Sandbox Code Playgroud)