Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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#_Multithreading_Recursion - Fatal编程技术网

C# 使用多线程为递归类实例创建新对象

C# 使用多线程为递归类实例创建新对象,c#,multithreading,recursion,C#,Multithreading,Recursion,假设有一个类a和它的一个实例classA,类a有四个子类,分别命名为a11、a12、a21和a22 A的构造函数在Parallel.For的帮助下在单独的线程中创建a11、a12、a21、a22 //interior of A A A11; A A12; A A21; A A22; public A() { Parallel.For(0,4,i=> { if(i==0) {A11= new A(/*recursion limit parameter*/)

假设有一个类a和它的一个实例
classA
,类a有四个子类,分别命名为a11、a12、a21和a22

A的构造函数在Parallel.For的帮助下在单独的线程中创建a11、a12、a21、a22

//interior of A
A A11;
A A12;
A A21;
A A22;

public A()
{
    Parallel.For(0,4,i=>
    {
         if(i==0) {A11= new A(/*recursion limit parameter*/);}
         if(i==1) {A12= new A(/*recursion limit parameter*/);}
         if(i==2) {A21= new A(/*recursion limit parameter*/);}
         if(i==3) {A22= new A(/*recursion limit parameter*/);}
    });
}
问题:是否有100%的把握认为A11..A22在平行出口时不会被破坏

例如:

1) 主线程启动构造函数

2) Parallel.For启动四个并发线程

3) 四个线程获得了类A的副本(还没有创建,它们如何并发工作?)

4) 它们中的每一个都在自己的副本中创建一个新对象(仅由创建者线程看到?)

5) 两端平行

选择使用哪个副本?如果所有这些都是真实创建的,那么这必须是一个连续的操作。但使用parallel.for时,创建时间会缩短

A11..A22也有四个组件,这会更深入,直到递归达到极限

谢谢

问题:A11..A22在平行出口时不会被摧毁,这有100%的把握吗

当然。它们可以在新创建的对象中访问。这是您的逻辑错误:

四个线程获得了类A的副本(还没有创建,它们如何并发工作?)


他们没有。这四个线程(如果确实有四个线程)都将使用
this
-实例已经创建,只是还没有完全初始化(构造函数还没有完成)。代码仍然可以使用构造函数尚未完成的对象-在这样做时您只需要小心。

发布一个自包含的最小代码如何?这也会帮助你得到答案。你是说真正的代码?