【问题标题】:What will happen if Thread object disappears before thread routine finishes? [duplicate]如果 Thread 对象在线程例程完成之前消失会发生什么? [复制]
【发布时间】:2018-07-11 18:57:12
【问题描述】:

我有一个关于线程对象的问题。 假设我在执行 'NewThread()' 方法的 'pendingThread' 上创建了一个新的 Thread 对象并启动它。 NewThread() 方法需要相当长的时间才能返回。如果在先前启动的线程返回之前重新初始化“pendingThread”会发生什么? 它会中止还是暂停?

很高兴看到你的回答

    public void Threaded_accept()//this function accepts client. It's executed on the new thread
    {
        bool pending = this.listen_socket.AcceptAsync(this.accept_args);// If completed Asynchronously
        //On_Accept_Completed is called Automatically

        if (pending == false)// If AcceptAsync was completed synchronously
        {

            this.pendingThread = new Thread(StartNewThread);
            pendingThread.Start();//This is for keep receiving requests while Thread is working
            //TODO What happens when pendingThread is reinitialized while pending Thread was running?
        }

        flow_control_event.WaitOne();//wait until scoket is accepted

    }

【问题讨论】:

  • 线程对象在执行代码时不能消失。与普通的 .NET 对象不同,不需要对象引用,因为 CLR 本身知道它。它知道线程何时启动和停止执行代码。同样值得注意的是 Thread 没有 Dispose() 方法,即使它使用 5 个非托管 OS 对象。与 Task 对象不同的是,它们也不能消失,而是通过实际的对象引用完成。存储在堆栈中,GC 总能找到它。

标签: c# .net multithreading


【解决方案1】:

前台线程一直运行直到它们正常退出(通过从作为线程启动函数给出的函数返回)或异常退出(由于异常,包括通过Thread.Abort从其他地方注入异常的可能性)或当整个进程被破坏。1

您无需保留对特定 Thread 对象的引用即可实现此目的。


1后台线程其实是一样的,只是需要记住的是,当所有的前台线程都退出时,这可能是整个进程被拆除的原因之一。

【讨论】:

  • 感谢您的回答!因此,垃圾收集器会检查线程是否仍在运行,甚至不存在对 Thread 对象的引用。这意味着只有退出的线程会被垃圾收集器销毁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多