使用多线程为递归类实例创建新对象
本文关键字:新对象 对象 创建 实例 多线程 递归 | 更新日期: 2023-09-27 18:25:57
假设有一个类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) 并行。For启动四个并发线程。
3) 四个线程获得了它们的A类副本(还没有创建,它们如何同时工作?)
4) 他们每个人都在自己的副本中创建一个新对象(只有创建者线程才能看到?)
5) 用于结束的并行
选择使用哪一份?如果所有这些都是真的创建的,那么这一定是一个连续的操作。但是当使用parallel.fo时,创建时间会减少。
A11..A22也有四个分量,这会更深入,直到递归地达到极限。
谢谢。
问题:对于出口,A11..A22在平行时不会被摧毁,这是百分之百的确定性吗?
当然。它们可以在新创建的对象中访问。这是你的逻辑错误:
四个线程获得了它们的A类副本(还没有创建,它们如何同时工作?)
他们没有。这四个线程(如果确实有是四个线程)都将使用this
——实例已经创建,只是还没有完全初始化(构造函数还没有完成)。代码仍然可以使用构造函数尚未完成的对象