gpt4 book ai didi

c# - Parallel.For 失败 (C#)

转载 作者:太空狗 更新时间:2023-10-30 00:27:29 24 4
gpt4 key购买 nike

我写了一些代码:

class Program
{
public const int count = 3000;
static List<int> list = new List<int>();
static void DoWork(int i)
{
list.Add(i);
}
static void Main(string[] args)
{
while (true)
{

Stopwatch s = new Stopwatch();
s.Start();
Parallel.For(0, count + 1, DoWork);
s.Stop();
Console.WriteLine("\n Elapsed: " + s.Elapsed.ToString());
Console.WriteLine("Expected: {0}", count + 1);
Console.WriteLine("count: {0}", list.Count);
Console.ReadKey();
list = new List<int>();
}
}
}

但结果不是预期的(

并非所有循环都在 Console.WriteLine 调用之前完成

使用 Parallel.For 有什么问题?

最佳答案

您遇到了所谓的 Race Condition .由于 .Net 中的 List 集合不是线程安全的,因此 Add() 等操作不是原子的。基本上,在一个线程上调用 Add() 可以在完成之前破坏另一个线程的 Add() 。您的代码需要一个线程安全的并发集合。

试试这个:

using System.Threading.Tasks;
class Program
{

public const int count = 3000;
static ConcurrentBag<int> bag = new ConcurrentBag<int>();
static void DoWork(int i)
{
bag.Add(i);
}
static void Main(string[] args)
{
while (true)
{

Stopwatch s = new Stopwatch();
s.Start();
Parallel.For(0, count + 1, DoWork);
s.Stop();
Console.WriteLine("\n Elapsed: " + s.Elapsed.ToString());
Console.WriteLine("Expected: {0}", count + 1);
Console.WriteLine("count: {0}", bag.Count);
Console.ReadKey();
bag = new ConcurrentBag<int>();
}
}
}

ConcurrentBag 是最接近线程安全列表的东西。请记住,由于我们正在处理未知的调度,因此整数不会按顺序排列。

关于c# - Parallel.For 失败 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6396256/

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