.net 在TAP/TPL之前,处于阻塞状态的工作线程是否曾经屈服并返回到旧threadpool模型中的threadpool?

.net 在TAP/TPL之前,处于阻塞状态的工作线程是否曾经屈服并返回到旧threadpool模型中的threadpool?,.net,asynchronous,task-parallel-library,threadpool,.net,Asynchronous,Task Parallel Library,Threadpool,请纠正我的理解 在引入基于任务的异步编程模型之前,.NET线程池的工作方式不同 1) 在旧系统下,当线程在I/O完成端口上阻塞时,它是否在阻塞状态下将CPU时间的一部分让给操作系统 2) 我的理解正确吗?在TPL附带的新线程池和任务调度器实现之后,现在一个线程在进入阻塞状态后立即返回线程池 3) 在旧机制中,阻塞的线程没有返回到线程池,因此导致了本可以避免的不必要的线程注入开销 1) 在旧系统中,当线程阻塞I/O时 完成端口,它是否将CPU时间的一部分提供给操作系统 当它处于阻塞状态时 对。它基

请纠正我的理解

在引入基于任务的异步编程模型之前,.NET线程池的工作方式不同

1) 在旧系统下,当线程在I/O完成端口上阻塞时,它是否在阻塞状态下将CPU时间的一部分让给操作系统

2) 我的理解正确吗?在TPL附带的新线程池和任务调度器实现之后,现在一个线程在进入阻塞状态后立即返回线程池

3) 在旧机制中,阻塞的线程没有返回到线程池,因此导致了本可以避免的不必要的线程注入开销

1) 在旧系统中,当线程阻塞I/O时 完成端口,它是否将CPU时间的一部分提供给操作系统 当它处于阻塞状态时

对。它基本上会在完成端口上调用wait等价物。请注意“遗嘱”。在这方面没有任何变化

2) 在新的线程池和任务之后,我的理解正确吗 TPL附带的调度器实现

这里没有什么新东西。你的错觉是从哪里来的?TPL建立在踏板池的顶部。它既没有改变它,也没有神奇地重写内核级调度程序

3) 在旧体制下,被封锁的线程不会回到 线程池,从而导致不必要的线程注入开销 本来可以避免的

还是这样。您仍然可以自由使用标准API。其他任何东西都是通过一些编译器技巧构建的,以使调用API更容易,但没有任何改变。仍然存在旧API更好的情况

所以,这部分是错误的。其余部分是正确的——线程在返回到池中之前不能从池中使用。标准线程API不会返回。新的线程两者都没有-线程被返回到任务调度程序,任务调度程序在另一个任务上使用它,但是从线程池端没有任何更改

1) 在旧系统中,当线程阻塞I/O时 完成端口,它是否将CPU时间的一部分提供给操作系统 当它处于阻塞状态时

对。它基本上会在完成端口上调用wait等价物。请注意“遗嘱”。在这方面没有任何变化

2) 在新的线程池和任务之后,我的理解正确吗 TPL附带的调度器实现

这里没有什么新东西。你的错觉是从哪里来的?TPL建立在踏板池的顶部。它既没有改变它,也没有神奇地重写内核级调度程序

3) 在旧体制下,被封锁的线程不会回到 线程池,从而导致不必要的线程注入开销 本来可以避免的

还是这样。您仍然可以自由使用标准API。其他任何东西都是通过一些编译器技巧构建的,以使调用API更容易,但没有任何改变。仍然存在旧API更好的情况


所以,这部分是错误的。其余部分是正确的——线程在返回到池中之前不能从池中使用。标准线程API不会返回。新线程两者都没有-线程被返回到任务调度程序,任务调度程序在另一个任务上使用它,但是从线程池端没有任何更改。

谢谢。我听到Jeffrey Richter(我想)在第9频道的一个视频中说,在.NET 4.5中,他们正在重新编写
ThreadPool
类实现。但我指的是窃取工作/负载平衡的新特性,这在以前是不存在的,但我明白你的意思。它使用相同的旧基础设施。否。他们对线程池进行了一些修改,以提高其效率。例如,线程现在在appdomains之间共享。但是窃取等不是在线程池中完成的。TaskScheduler位于普通线程之上,并将它们分配给任务。归根结底,线程是一种内核级机制(至少在Windows实现中是这样)。是的,当然,工作窃取是由调度程序完成的,线程池仍然只对其中的工作项或托管的最小和最大线程进行排队,并预测和处理过度订阅。我没有推断线程池会这样做。我只是认为他们也重新编写了线程池,您已经澄清了这一点。正如您所说,重新编写/重构线程池以适应新的范式是不可避免的。我只是觉得ThreadPool现在的表现完全不同了。谢谢你的澄清。事实证明我显然被自己的不理解所误导。这不是杰弗里·里克特,而是乔·达菲,在本次采访中,查尔斯采访了安德斯·海尔斯伯格和乔·达菲关于第三方物流、PFX和PLINQ的情况。乔在11:55()和13:18()之间所说的话是我困惑的原因,事后我意识到他所说的与我认为的完全相反。谢谢。我听到Jeffrey Richter(我想)在第9频道的一个视频中说,在.NET 4.5中,他们正在重新编写
ThreadPool
类实现。但我指的是窃取工作/负载平衡的新特性,这在以前是不存在的,但我明白你的意思。它使用相同的旧基础设施。否。他们对线程池进行了一些修改,以提高其效率。例如,线程现在在appdomains之间共享。但是窃取等不是在线程池中完成的。TaskScheduler位于普通线程之上,并将它们分配给任务。归根结底,线程是一种内核级机制(至少在Windows实现中是这样)。是的,当然,工作窃取是由调度程序完成的,线程池仍然是唯一的