gpt4 book ai didi

c# - BitArray 线程安全

转载 作者:行者123 更新时间:2023-11-30 15:02:52 25 4
gpt4 key购买 nike

我正在寻找有关并发写入 System.Collections.BitArray 类的线程安全性的信息。

具体来说,请考虑以下人为设计的示例:

BitArray bits = new BitArray(1000000);

Parallel.For(0, bits.Count, i =>
{
bits[i] = i % 3 == 0;
});

直觉告诉我,如果两个线程试图写入位数组的相同基础整数值,并发解锁访问将产生不正确的结果,但我找不到任何证据支持它,并且我在运行期间没有遇到任何问题。

这是一个安全的操作吗?

如果不是,为什么我看不到此代码失败或产生不正确的输出?

更新

经过进一步测试,我认为下面的测试证明在这个例子中使用BitArray不是线程安全的。

另一方面,使用 bool[] 似乎是安全的。

private static bool CompareBitArrays(BitArray a, BitArray b)
{
if (a.Count != b.Count) return false;
for (int i = 0; i < a.Count; i++)
{
if (a[i] != b[i]) return false;
}
return true;
}

static void Main(string[] args)
{
int numElements = 1000000;

//create single-threaded bitarray with certifiably correct values.
BitArray controlGroup = new BitArray(numElements);
for (int i = 0; i < numElements; i++)
{
controlGroup[i] = i % 3 == 0;
}

//create a BitArray and bool array of equal size and fill them using Parallel.For.
BitArray bits = new BitArray(numElements);
bool[] bools = new bool[numElements];

Parallel.For(0, numElements, i =>
{
bits[i] = bools[i] = i % 3 == 0;
});

//Create a BitArray from the bool array
BitArray boolBits = new BitArray(bools);

//Check if they contain correct values
bool isBitArrayCorrect = CompareBitArrays(controlGroup, bits); //FALSE
bool isBoolArrayCorrect = CompareBitArrays(controlGroup, boolBits); //TRUE
}

正如我提到的,我怀疑原因是 BitArray 中的 32 个值共享数组的相同整数值。

这个逻辑正确吗?

为了提问,请假设除了代码中显示的线程之外,没有其他线程正在访问该集合。

最佳答案

查看 BitArray.Set 方法代码:

public void Set(int index, bool value)
{
if (index < 0 || index >= this.Length)
{
throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
}
if (value)
{
this.m_array[index / 32] |= 1 << index % 32;
}
else
{
this.m_array[index / 32] &= ~(1 << index % 32);
}
this._version++; // this is definitely thread-unsafe
}

就您通过索引访问集合成员而不枚举它而言,我在那里看到的唯一线程不安全代码行是最后一行 this._version++;

但它就在那里,所以,你可以认为这段代码是线程不安全的。

关于c# - BitArray 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12348489/

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