【发布时间】:2019-01-15 13:34:31
【问题描述】:
int signal_length=1000_000;
double[] x=new double[signal_length];
var Signal = new Series
{
IsVisibleInLegend = true,
ChartType = SeriesChartType.Line,
LegendText = "Original Signal",
};
var options = new ParallelOptions() { MaxDegreeOfParallelism = 4 };
Parallel.For(0, x.Length,options, i =>
{
Signal.Points.AddY(x[i]);
});
chart.Series.Add(Signal);
错误信息:
System.IndexOutOfRangeException: '索引超出了数组的范围。'
我认为这个错误是由于并行循环不是原子的
我想要 C++ 中的“REDUCTION”之类的东西
【问题讨论】:
-
每个并行进程应该是 x.Length/4。起点 0 也必须改变。
-
我的猜测是异常发生在
Points.AddY内部。请通过发布异常的堆栈跟踪来确认这种怀疑。如果是,则贴出AddY方法的源代码。它很可能没有实现线程安全, -
发布的代码看起来甚至不适合并行性.. Parallel.For 不是“减少”,因此不确定如何显示声称的目标。
-
@jdweng 不,
Parallel.For(0, x.Length, ...是正确的 -
为什么你认为
Signal.Points.AddY是线程安全的?图表系列是线程安全的是没有意义的。顺序是图表中最重要的东西之一
标签: c# multithreading parallel-processing mschart