1

假设有一个类 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 在 Parallel.For 退出时不会被破坏?

例子:

1)主线程发起构造函数。

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

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

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

5)Parallel.for 结束

选择使用哪个副本?如果一切都是真实的,那么这一定是一个连续的动作。但是使用 parallel.for 时创建时间会减少。

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

谢谢。

4

1 回答 1

3

问题:是否有 %100 确定 A11..A22 在 Parallel.For 退出时不会被破坏?

绝对地。它们在新创建的对象中是可访问的。这一点是您的逻辑错误:

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

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

于 2013-08-02T23:14:53.110 回答