首页 新闻 会员 周边 捐助

c#的Task是针对多核优化的吗

0
悬赏园豆:10 [已解决问题] 解决于 2021-01-05 22:01

也就是说,假设1个核心能同时运行2个线程,当主线程所在的CPU核心还有一个子线程在运行,Task会去找其他核心的空闲线程吗?

PER10的主页 PER10 | 初学一级 | 园豆:8
提问于:2021-01-03 21:43
< >
分享
最佳答案
1

C#的Task与线程没有什么关系,只是Task最终需要一个线程去执行。
决定Task在哪个线程上执行的是TaskScheduler,默认的调度器是线程池调度器,也就是默认Task在线程池线程中执行。
还有其他的调度器,可以让Task在指定的线程执行,甚至说,可以自定义一个调度器,让每一个Task都在一个新线程中执行。

收获园豆:7
拓拓 | 小虾三级 |园豆:1055 | 2021-01-04 09:13

是的,最终是分派给一个线程处理,这个固然没错,我就是想知道其他核心的空闲线程也有可能分派给这个Task吗?如果有,就是说明Task能利用多核的优势了。

PER10 | 园豆:8 (初学一级) | 2021-01-05 05:22

@PER10: 我觉得我说的已经很清楚了,默认在线程池执行。线程池可以利用所有核心,所以你的问题是能不能利用多核,答案是能,只要利用线程池的都能。
但是必须说明,Task的概念与线程无关。

拓拓 | 园豆:1055 (小虾三级) | 2021-01-05 16:50

@拓拓: 嗯嗯,我没咋接触过线程池,所以不知道原理,感谢。

PER10 | 园豆:8 (初学一级) | 2021-01-05 22:00
其他回答(2)
0

题主是说的TPL编程吧。
  优秀软件的一个关键特征就是具有并发性。过去的几十年,我们可以进行并发编程,但是
难度很大。以前,并发性软件的编写、调试和维护都很难,这导致很多开发人员为图省事
放弃了并发编程。新版 .NET 中的程序库和语言特征,已经让并发编程变得简单多了。随
着 Visual Studio 2012 的发布,微软明显降低了并发编程的门槛。以前只有专家才能做并发
编程,而今天,每一个开发人员都能够(而且应该)接受并发编程。

  许多个人电脑和工作站都有多核CPU,可以同时执行多个线程。为了充分利用硬件,您可以将代码并行化,以便跨多个处理器分发工作。

更多可以参考这篇文章《并发编程是什么鬼》

收获园豆:2
楠木大叔 | 园豆:2083 (老鸟四级) | 2021-01-04 22:00

谢谢,现在不做并发肯定不行,CPU已经非同往日,自己不优化好程序就会落后别人的。

支持(0) 反对(0) PER10 | 园豆:8 (初学一级) | 2021-01-05 05:18
0

我觉得是可以的,虽然我没有试过。

收获园豆:1
会长 | 园豆:12463 (专家六级) | 2021-01-05 09:40

我尝试用Thread和Task分别执行一个单一函数,里面初始化100万个类,结果总是Task速度领先,应该是利用多核了,网上资料说当有重复任务时会并行分派给其他核心,所以就比较快了吧。

支持(0) 反对(0) PER10 | 园豆:8 (初学一级) | 2021-01-05 22:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册