gpt4 book ai didi

c# - 带有 Parallel.For() 的 AccessViolationException

转载 作者:行者123 更新时间:2023-11-30 18:46:25 24 4
gpt4 key购买 nike

下面的代码片段展示了一个我能够从生产代码中分离出来的错误。该程序将因 System.AccessViolationException 而崩溃。

我的系统配置是 Windows 8.1 x64 上的 Visual Studio 2013。要重现该错误,请在 Visual Studio 中执行以下步骤:

  1. 创建一个空的控制台应用程序
  2. 用下面的代码替换Program.cs的全部内容
  3. Release模式下编译,任何CPU
  4. 开始不调试 (CTRL + F5)

程序将立即崩溃,在控制台窗口中显示错误堆栈跟踪。

我无法进一步减少代码,即修改代码的任何部分都会使错误消失。

有什么办法可以找出这个错误的根本原因吗?什么是好的解决方法?

using System;
using System.Threading.Tasks;

namespace ParallelBugTest
{
class Program
{
private class Value
{
public double X;
}

private class Aggregator
{
private Value myval = new Value();

public void Add()
{
// use Min() instead of Max() -> bug disappears
myval.X = Math.Max(0, myval.X);
}
}

public static void Main(string[] args)
{
Parallel.For(0, 10000, Process);
}

private static void Process(int k)
{
Value[] V = new Value[10000];
Aggregator aggregator = new Aggregator();

for (int i = 0; i < V.Length; i++)
{
V[i] = new Value();
aggregator.Add();
}
}
}
}

最佳答案

代码中的所有内容都是线程安全的,因为线程之间没有共享状态(每次迭代都有自己的 AggregatorValue 数组,你不使用任何 static 字段)。

即使您的代码不是线程安全的,它也不会做任何不安全的事情(即直接使用内存),这应该是获得 AccessViolationException 的唯一方法。

因此,我认为这是 CLR 中的错​​误,您应该 report it (登录后点击“提交反馈”链接)。

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

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