假设有一个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也有四个组成部分,直到达到递归限制为止。
感谢。
答案 0 :(得分:3)
问题:当Parallel.For退出时,是否有%100确定A11..A22不会被销毁?
绝对。它们可以在新创建的对象中访问。这个位是你的逻辑错误:
四个线程获得A类副本(尚未创建,它们如何同时工作?)
他们没有。四个线程(如果确实存在 四个线程)将全部使用this
- 实例已创建,尚未完全初始化(构造函数尚未完成)。代码仍然可以使用一个构造函数尚未完成的对象 - 这样做时你需要小心。