【发布时间】:2014-10-18 10:36:35
【问题描述】:
下面的代码 sn-p 展示了一个我能够从生产代码中隔离出来的错误。该程序将崩溃并显示System.AccessViolationException。
我的系统配置是 Windows 8.1 x64 上的 Visual Studio 2013。要重现该错误,请在 Visual Studio 中执行以下步骤:
- 创建一个空的控制台应用程序
- 用下面的代码替换 Program.cs 的全部内容
- 在Release模式下编译,任何CPU
- 开始不调试(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();
}
}
}
}
【问题讨论】:
-
有趣:
Parallel.For(0, 2000, Process);有时会崩溃。
标签: c# crash task-parallel-library parallel-extensions