作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找有关并发写入 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/
我是一名优秀的程序员,十分优秀!