我正在寻找有关并发写入System.Collections.BitArray
类的线程安全性的信息。
具体来说,考虑以下人为设计的示例:
BitArray bits = new BitArray(1000000);
Parallel.For(0, bits.Count, i =>
{
bits[i] = i % 3 == 0;
});
本能告诉我,如果两个线程尝试写入 bitarray 的相同底层整数值,并发解锁访问会产生不正确的结果,但我找不到任何证据支持它,而且我在运行时没有遇到任何问题。
这是一个安全的操作吗?
如果没有,为什么我没有看到此代码失败或产生不正确的输出?
更新
经过进一步的测试,我认为下面的测试证明了BitArray
在这个例子中使用 a不是线程安全的。
bool[]
另一方面,使用 a似乎是安全的。
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
}
正如我所提到的,我怀疑原因是数组中的 32 个值BitArray
共享相同的数组整数值。
这个逻辑正确吗?
为了提问,请假设除了代码中显示的线程之外没有线程正在访问该集合。