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类中内置的函数以更安全的方式实现?如果可能的话,我想避免涉及显式锁定的解决方案.
让我们假设(这些限制不是基本的,只是为了简化说明)
currentFlags是0请注意,如果我们将 bit 设置k为1incurrentFlags 一次,我们可以替换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)
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |