Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#线程在第二个线程上崩溃,不确定如何修复_C#_.net_Multithreading_Concurrency_For Loop - Fatal编程技术网

C#线程在第二个线程上崩溃,不确定如何修复

C#线程在第二个线程上崩溃,不确定如何修复,c#,.net,multithreading,concurrency,for-loop,C#,.net,Multithreading,Concurrency,For Loop,只是为了好玩,我创建了一个mandelbrot程序。我现在尝试将图像分成两个左/右部分,由两个线程处理,从而实现多线程。但是,应用程序一启动就崩溃(尽管根据我的控制台输出,第一个线程在崩溃后继续运行,但第二个线程从未启动),我不确定该怎么办 崩溃发生在this行。输出[x][y]=this。计算\u像素\u rgb(x,y)并说我缺少一个对象引用,我不理解,因为它适用于第一个线程 public void compute_all() { this.setcolors

只是为了好玩,我创建了一个mandelbrot程序。我现在尝试将图像分成两个左/右部分,由两个线程处理,从而实现多线程。但是,应用程序一启动就崩溃(尽管根据我的控制台输出,第一个线程在崩溃后继续运行,但第二个线程从未启动),我不确定该怎么办

崩溃发生在
this行。输出[x][y]=this。计算\u像素\u rgb(x,y)并说我缺少一个对象引用,我不理解,因为它适用于第一个线程

    public void compute_all()
    {
        this.setcolors(); this.zoom_multiplier = (4 / this.zoom / this.resolution);
        Thread thread1 = new Thread(new ParameterizedThreadStart(computation_thread)); thread1.Start(new double[] { 0, 0.5 });
        Thread thread2 = new Thread(new ParameterizedThreadStart(computation_thread)); thread2.Start(new double[] { 0.5, 1 });
        thread1.Join(); thread2.Join();
    }

    public void computation_thread(object threadinfo)
    {
        double[] parameters = (double[])threadinfo;

        this.output = new int[this.resolution][][];
        for (int x = (int)(this.resolution * parameters[0]); x < (int)(this.resolution * parameters[1]); x++)
        {
            this.output[x] = new int[this.resolution][];
            for (int y = 0; y < this.resolution; y++)
            {
                this.output[x][y] = this.calculate_pixel_rgb(x, y);
                this.pixels_completed++;
            }
        }
    }
public void compute_all()
{
this.setcolors();this.zoom_乘数=(4/this.zoom/this.resolution);
Thread thread1=新线程(新参数化的threadstart(计算线程));thread1.Start(新的double[]{0,0.5});
Thread thread2=新线程(新参数化的threadstart(计算线程));thread2.Start(新的double[]{0.5,1});
thread1.Join();thread2.Join();
}
公共无效计算线程(对象线程信息)
{
double[]参数=(double[])threadinfo;
this.output=newint[this.resolution][];
对于(int x=(int)(this.resolution*参数[0]);x<(int)(this.resolution*参数[1]);x++)
{
this.output[x]=newint[this.resolution][];
对于(int y=0;y
您的两个线程正在操作相同的输出缓冲区,并相互覆盖。如果可以避免的话,不要在线程之间共享内存;它只会引起悲伤

如果本练习的目的是学习如何操作原始线程,那么请后退一步,研究为什么跨两个线程共享内存是个坏主意

如果本练习的目的是并行化分形的计算,那么请忘记操作原始线程。学习如何使用任务并行库,您会做得更好


线程在逻辑上是工作者,谁想管理一群工作者?TPL鼓励您将并行化视为对可以并行完成的任务的操作。让第三方物流负责计算分配给您的任务的工人数量

您的两个线程正在操作相同的输出缓冲区,相互覆盖。如果可以避免的话,不要在线程之间共享内存;它只会引起悲伤

如果本练习的目的是学习如何操作原始线程,那么请后退一步,研究为什么跨两个线程共享内存是个坏主意

如果本练习的目的是并行化分形的计算,那么请忘记操作原始线程。学习如何使用任务并行库,您会做得更好


线程在逻辑上是工作者,谁想管理一群工作者?TPL鼓励您将并行化视为对可以并行完成的任务的操作。让第三方物流负责计算分配给您的任务的工人数量

代码中的问题是初始化
此。多次输出(每个线程一次)

两个线程都使用相同的
this
,当第一个线程初始化
this.output
的列时,第二个线程将重新初始化它,第一个线程将丢失其分配的内存

因此,
this.output[x]
将不再存在于第一个线程中(
缺少对象引用
异常)

这也解释了为什么你的代码只用一个线程就能完美运行


最简单的解决方案是从一开始就初始化整个数组。

代码中的问题是多次初始化
此。输出
(每个线程一次)

两个线程都使用相同的
this
,当第一个线程初始化
this.output
的列时,第二个线程将重新初始化它,第一个线程将丢失其分配的内存

因此,
this.output[x]
将不再存在于第一个线程中(
缺少对象引用
异常)

这也解释了为什么你的代码只用一个线程就能完美运行


最简单的解决方案是从一开始就初始化整个阵列。

您的逻辑似乎有问题

但是如果您认为它是正确的,并且重置
此。每个线程中都需要输出
数据,那么请执行以下操作:

  • 临时排列
  • [x][y]
    更改为[x,y]
  • []]
    更改为
    [,]
  • 在设置为此之前应用
    锁定
    。输出

  • 你的逻辑似乎可疑

    但是如果您认为它是正确的,并且重置
    此。每个线程中都需要输出
    数据,那么请执行以下操作:

  • 临时排列
  • [x][y]
    更改为[x,y]
  • []]
    更改为
    [,]
  • 在设置为此之前应用
    锁定
    。输出

  • 我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。我已经编辑了你的标题。请参见“”,其中一致意见是“不,他们不应该”。我在thread方法之外初始化了数组,得到了相同的错误…@user1653653您的意图是什么?你想在没有任何控制的情况下用任何线程覆盖相同的数据吗?你可能缺少其他内容,请随时用新代码更新你的问题:)我在thread方法之外初始化了数组,得到了相同的错误…@user1653653你的意图是什么?您想在没有任何控制的情况下用任何线程覆盖相同的数据吗?您可能缺少其他内容,请随时更新