我面临一个我无法解释的奇怪问题,我想知道你们中有些人是否有我缺乏的答案。
我有一个小测试应用程序,用于测试多线程修改我正在制作更大的代码。在这个应用程序中,我设置了两个函数,一个循环执行循环,另一个使用Task.Parallel.For。他们两个打印出时间和最终元素。我所看到的是执行Parallel.For的函数生成的项目少于顺序循环,这对于真正的应用程序来说是一个巨大的问题(它正在弄乱一些最终结果)。所以,我的问题是,如果有人知道为什么会发生这种情况,如果有的话,无论如何都要修复它。
以下是在我的测试应用中使用parallel.for的函数的代码:
static bool[] values = new bool[52];
static List<int[]> combinations = new List<int[]>();
static void ParallelLoop()
{
combinations.Clear();
Parallel.For(0, 48, i =>
{
if (values[i])
{
for (int j = i + 1; j < 49; j++)
if (values[j])
{
for (int k = j + 1; k < 50; k++)
{
if (values[k])
{
for (int l = k + 1; l < 51; l++)
{
if (values[l])
{
for (int m = l + 1; m < 52; m++)
{
if (values[m])
{
int[] combination = { i, j, k, l, m };
combinations.Add(combination);
}
}
}
}
}
}
}
}
}); // Parallel.For
}
以下是应用输出:
Executing sequential loop...
Number of elements generated: 1,712,304
Executing parallel loop...
Number of elements generated: 1,464,871
提前致谢,如果您需要澄清,我会尽力详细解释。
答案 0 :(得分:8)
您不能仅通过多个线程在列表中添加项目而无需任何同步机制。 List<T>.Add()
实际上做了一些非常重要的内部事务(缓冲区......等),因此添加项目不原子线程安全操作。
或者:
System.Collections.Concurrent
命名空间)