也就是说,假设1个核心能同时运行2个线程,当主线程所在的CPU核心还有一个子线程在运行,Task会去找其他核心的空闲线程吗?
C#的Task与线程没有什么关系,只是Task最终需要一个线程去执行。
决定Task在哪个线程上执行的是TaskScheduler,默认的调度器是线程池调度器,也就是默认Task在线程池线程中执行。
还有其他的调度器,可以让Task在指定的线程执行,甚至说,可以自定义一个调度器,让每一个Task都在一个新线程中执行。
是的,最终是分派给一个线程处理,这个固然没错,我就是想知道其他核心的空闲线程也有可能分派给这个Task吗?如果有,就是说明Task能利用多核的优势了。
@PER10: 我觉得我说的已经很清楚了,默认在线程池执行。线程池可以利用所有核心,所以你的问题是能不能利用多核,答案是能,只要利用线程池的都能。
但是必须说明,Task的概念与线程无关。
@拓拓: 嗯嗯,我没咋接触过线程池,所以不知道原理,感谢。
题主是说的TPL编程吧。
优秀软件的一个关键特征就是具有并发性。过去的几十年,我们可以进行并发编程,但是
难度很大。以前,并发性软件的编写、调试和维护都很难,这导致很多开发人员为图省事
放弃了并发编程。新版 .NET 中的程序库和语言特征,已经让并发编程变得简单多了。随
着 Visual Studio 2012 的发布,微软明显降低了并发编程的门槛。以前只有专家才能做并发
编程,而今天,每一个开发人员都能够(而且应该)接受并发编程。
许多个人电脑和工作站都有多核CPU,可以同时执行多个线程。为了充分利用硬件,您可以将代码并行化,以便跨多个处理器分发工作。
更多可以参考这篇文章《并发编程是什么鬼》
谢谢,现在不做并发肯定不行,CPU已经非同往日,自己不优化好程序就会落后别人的。
我觉得是可以的,虽然我没有试过。
我尝试用Thread和Task分别执行一个单一函数,里面初始化100万个类,结果总是Task速度领先,应该是利用多核了,网上资料说当有重复任务时会并行分派给其他核心,所以就比较快了吧。