gpt4 book ai didi

c# - Parallel 用于在循环时丢失值

转载 作者:行者123 更新时间:2023-11-30 13:58:22 26 4
gpt4 key购买 nike

我遇到了一个我无法解释的奇怪问题,我想知道你们中的一些人是否有我所缺少的答案。

我有一个小型测试应用程序,用于测试我对更大代码所做的多线程修改。在此应用程序中,我设置了两个函数,一个按顺序执行循环,另一个使用 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

提前致谢,如果您需要一些说明,我会尽我所能进行更详细的解释。

最佳答案

您不能在没有任何同步机制的情况下同时通过多个线程在您的列表中添加项目。 List<T>.Add()实际上做了一些非常重要的内部工作(缓冲区等),所以添加一个项目不是原子线程安全操作。

或者:

  • 提供一种同步写入的方法
  • 使用支持并发写入的集合(参见 System.Collections.Concurrent 命名空间)
  • 根本不要使用多线程

关于c# - Parallel 用于在循环时丢失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17319878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com