多线程概念:在所有子线程完成执行之前,`threading`会执行return语句吗?

时间:2016-09-08 04:52:02

标签: c# multithreading

我有一个最近一直困扰着我的线程问题。看看下面的示例C#代码。

 public void threading()
 {
     for(int count =0; count< 4; count++)
     {
        Thread childThread = new Thread(childThread);
        childThread.start()
     }

     return;
 }

public void childThread()
{
 // Do alot of work 
}

由于在threading方法中的循环之后有一个return语句,threading会在所有子线程完成执行之前执行return语句吗?我在某处看到线程与fork不同,因为它们没有创建一个单独的内存区域,所以死线程会在哪里结束?

2 个答案:

答案 0 :(得分:2)

  

将线程在所有子进程之前执行return语句   线程完成执行?

也许是的。也许不是。这完全取决于你的childThread方法执行的时间。如果你的childThread方法花费的时间真的少,那么在threading方法中执行return语句之前,所有四个线程都会完成。

另一方面,如果需要很长时间,那么即使threading方法执行完毕或已返回Main,您的线程也可以异步继续执行。

您还需要了解一件事:

默认情况下,他们创建的所有这些线程都是后台线程。所以只要你的过程还活着,它们就会存在。如果您的主GUI线程即将结束,那么这四个线程也将进行折腾并将被中止。因此,至少有一个前台线程必须处于活动状态才能使您的四个线程继续执行childThread方法以便运行完成。

就内存而言 - 创建的每个线程都有自己的堆栈内存区域,但它们共享公共堆内存。此外,无论是堆栈内存还是线程堆内存,它肯定会位于进程自身地址空间的外围。

答案 1 :(得分:0)

如果要强制所有子线程在threading方法返回之前终止,则可以在线程上使用Join方法,例如

public void Threading()
{
    List<Thread> threads = new List<Thread>();

    // start all threads
    for(int count =0; count< 4; count++)
    {
        Thread childThread = new Thread(ChildThread);
        childThread.start();
        threads.Add(thread);
    }

    // block until all threads have terminated
    for(int count =0; count< 4; count++)
    {
        threads[count].Join();
    }

    // won't return until all threads have terminated
    return;
}

public void ChildThread()
{
    // Do alot of work 
}