作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到一些涉及Parallel for循环并添加到列表的问题。问题是,相同的代码可能在不同的时间生成不同的输出。我在下面设置了一些测试代码。在此代码中,我创建了一个10,000个int值的列表。值的1/10将为0,值的1/10将为1,一直到值的1/10为止为9。
设置完此列表后,我设置了一个用于循环访问列表的Parallel for循环。如果当前数字为0,则向新列表中添加一个值。在Parallel for循环完成后,我输出列表的大小。大小应始终为1,000。大多数时候,给出正确的答案。但是,我已经看到3种可能出现的不正确结果:
doubleList.Add(0.0);
doubleList.Add(0.0);
Destination array was not long enough. Check destIndex and length, and the array's lower bounds.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ParallelTest
{
class Program
{
static void Main(string[] args)
{
List<int> intList = new List<int>();
List<double> doubleList = new List<double>();
for (int i = 0; i < 250; i++)
{
intList.Clear();
doubleList.Clear();
for (int j = 0; j < 10000; j++)
{
intList.Add(j % 10);
}
Parallel.For(0, intList.Count, j =>
{
if (intList[j] == 0)
{
doubleList.Add(0.0);
}
});
if (doubleList.Count != 1000)
{
Console.WriteLine("On iteration " + i + ": List size = " + doubleList.Count);
}
}
Console.WriteLine("\nPress any key to exit.");
Console.ReadKey();
}
}
}
最佳答案
我希望System.Collections.Generic.List不是线程安全的,这意味着如果您尝试同时从两个不同的线程中Add
,事情将会出错。是的,它在docs中是这样说的。
您可以通过多种方式阻止这种情况的发生:
关于list - 并行For循环-添加到列表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752358/
我是一名优秀的程序员,十分优秀!