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

本文关键字:新对象 对象 创建 实例 多线程 递归 | 更新日期: 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——实例已经创建,只是还没有完全初始化(构造函数还没有完成)。代码仍然可以使用构造函数尚未完成的对象