【发布时间】:2012-09-03 03:08:22
【问题描述】:
我正在寻找有关并发写入 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 个值共享数组的相同整数值。
这个逻辑正确吗?
为了提问,请假设除了代码中显示的线程之外没有线程正在访问该集合。
【问题讨论】:
标签: c# parallel-processing thread-safety bitarray