我正在尝试在多线程的.NET应用程序中设置共享变量的位标志,但是找不到与本地InterlockedOr函数相对应的托管Interlocked类。我想出了以下代码来执行|=赋值,但理论上可能会出现无限循环的情况,这让我感到不安:
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 类中的函数以更安全的方式实现这个功能?如果可能的话,我希望避免涉及显式锁定的解决方案。
CompareExchange
时存在无限循环的可能性,但这种情况极少出现,可以忽略不计。.NET框架广泛使用此技术,包括在所有并发集合中,以实现无锁同步。 - Paul TurnerInterlocked
最好的方法。 - Sergey Kalinichenko