gpt4 book ai didi

.net - 线程的垃圾收集

转载 作者:行者123 更新时间:2023-12-04 10:57:46 24 4
gpt4 key购买 nike

我需要保护Thread来自垃圾收集器的对象?包含线程运行的函数的对象呢?

考虑这个简单的服务器:

class Server{
readonly TcpClient client;

public Server(TcpClient client){this.client = client;}

public void Serve(){
var stream = client.GetStream();
var writer = new StreamWriter(stream);
var reader = new StreamReader(stream);

writer.AutoFlush = true;
writer.WriteLine("Hello");

while(true){
var input = reader.ReadLine();
if(input.Trim() == "Goodbye")
break;
writer.WriteLine(input.ToUpper());
}

client.Close();
}
}
static void Main(string[] args){
var listener = new TcpListener(IPAddress.Any, int.Parse(args[0]));
listener.Start();

while(true){
var client = listener.AcceptTcpClient();
var server = new Server(client);
var thread = new Thread(server.Serve);
thread.Start();
}
}

我应该将我的线程对象包装在某种静态集合中以防止它们被垃圾收集器清除吗?

据推测,如果 Thread对象本身保持事件状态,然后 Server对象会存活,因为线程持有对委托(delegate)的引用,委托(delegate)持有对目标对象的引用。或者也许线程对象本身被收集,但实际线程继续运行。现在 Server对象已准备好收集。然后如果它试图访问它的字段会发生什么?

垃圾收集有时让我头晕目眩。我很高兴我通常不必考虑它。

考虑到这里的潜在问题,我想相信垃圾收集器足够聪明,不会在线程本身仍在执行时收集线程对象,但我找不到任何这样的文档。反射器在这里没有什么帮助,因为 Thread 的大部分内容不出所料,类在 MethodImplOptions.InternalCall 中实现职能。而且我宁愿不通过我旧的过时的 SSCLI 副本来寻找答案(既因为它很痛苦,也因为它不是一个确定的答案)。

最佳答案

这很简单。真正的执行线程不是 Thread 对象。该程序在真正的 Windows 线程中执行,无论您的 .NET 垃圾收集器对 Thread 对象做什么,这些线程都保持事件状态。所以对你来说是安全的;如果您只想让程序继续运行,则不需要关心 Thread 对象。

另请注意,您的线程在运行时不会被收集,因为它们实际上属于应用程序“根”。 (根源——垃圾收集器就是这样知道什么是活着的。)

更多细节:可通过 Thread.CurrentThread 访问托管线程对象- 这类似于全局静态变量,并且不会被收集。正如我之前所写的:任何已启动并现在执行任何代码(甚至在 .NET 之外)的托管线程都不会丢失其 Thread 对象,因为它与“根”紧密相连。

关于.net - 线程的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4720991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com