【发布时间】:2015-07-27 15:21:28
【问题描述】:
我正在尝试在多线程 .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));
是否可以仅使用 Interlocked 类中内置的函数以更安全的方式实现?如果可能,我想避免涉及显式锁定的解决方案。
【问题讨论】:
-
虽然在使用
CompareExchange时可能会出现无限循环,但这种情况不太可能发生,可以忽略不计。 .NET Framework 广泛使用了这种技术,包括在所有并发集合中以实现无锁同步。 -
只有当其他线程同时将标志重置为零时,您才会获得无限循环,并且足够灵活,每次都可以击败您的线程,进行无限次尝试。如果发生这种情况,你有更大的问题需要解决,弄清楚为什么“敏捷”线程会做它所做的事情。我认为您的解决方案与
Interlocked一样好。
标签: c# .net multithreading bit-manipulation interlocked