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

时间:2013-08-02 23:09:23

标签: 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*/);}
         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*/);}
    });
}

问题:当Parallel.For退出时,是否有%100确定A11..A22不会被销毁?

示例:

1)主线程启动构造函数。

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

3)四个线程获得A类的副本(尚未创建,它们如何同时工作?)

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

5)Parallel.for结束

选择使用哪个副本?如果所有都是真正创建的,那么这必须是一个串行动作。但是当使用parallel.for时,创建时间会减少。

A11..A22也有四个组成部分,直到达到递归限制为止。

感谢。

1 个答案:

答案 0 :(得分:3)

  

问题:当Parallel.For退出时,是否有%100确定A11..A22不会被销毁?

绝对。它们可以在新创建的对象中访问。这个位是你的逻辑错误:

  

四个线程获得A类副本(尚未创建,它们如何同时工作?)

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