1 C#thread 1 CPU线程?

时间:2015-01-20 05:23:26

标签: c# multithreading

我想知道1个C#线程是否以1个CPU线程为例:

如果你的cpu有8个线程t.ex:4790k并且你启动2个新的c#线程你会失去2个线程吗?比如8 - 2 = 6?

3 个答案:

答案 0 :(得分:2)

线程不是核心。在您提供的情况下,您的计算机有8个核心(4个物理和4个逻辑),可以处理线程。计算机可以同时处理数百个线程,并且可以非常快速地切换它们。如果在C#应用程序中创建Thread类,它将创建一个新的线程,该线程将在CPU上的任何内核上执行。你拥有的核心越多,你的计算机运行得越快,因为它可以同时处理更多的线程(计算机的速度还有其他因素,那么你拥有多少核心)。

答案 1 :(得分:2)

如果我没记错的话,虚拟机(CLR)可以自由地做任何想做的事情。例如,有一些称为绿色线程的实现,它们不一定将托管线程映射到本机线程。但是当然在桌面x86上的.NET中,我们知道的实现很难真正映射到系统线程 现在这是一层,但它仍然没有说明CPU,操作系统调度程序将让硬件线程(由于超线程虚拟化)在确定其正常时执行本机线程。有这样的事情被称为overcommit,它说的是当太多本机线程想要运行时(存在于OS的调度程序ready queue中),但CPU只有那么多线程可供使用,因此有些线程仍在等待,直到他们的权重是操作系统调度程序的内部指标,决定轮到他们 您可以查看此文档以获取更多信息:https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt

那么对于CLR,也许这个问题:https://social.msdn.microsoft.com/Forums/vstudio/en-US/e8cb1585-f6b9-424e-a41f-b3ae02d7f398/how-managed-thread-works-and-exists-on-native-platform-?forum=csharpgeneral

确实在讨论中找到了有用的MSDN页面的链接:
http://msdn.microsoft.com/en-us/library/74169f59(v=vs.110).aspx

解释说:

  

操作系统ThreadId与托管没有固定的关系   线程,因为非托管主机可以控制之间的关系   托管和非托管线程。具体而言,复杂的主机可以   使用Fiber API根据相同的方式安排许多托管线程   操作系统线程,或移动不同的托管线程   操作系统线程。

非常有趣的原因。当然之一是虚拟机实现的自由。但另一个是在本机/管理屏障之间传递的自由,具有很大的灵活性,如本页所述。值得注意的是,本机线程可以进入托管appdomains BACKWARDS,并看到虚拟机自动分配托管线程对象。使用线程ID哈希值维护此管理。疯狂的东西:)

编辑:实际上我们可以在这个页面看到:
http://msdn.microsoft.com/en-us/magazine/cc163567.aspx#S3
CLR具有可配置的线程API映射。非常灵活,这确实证明你不能确定1C#thread == 1原生线程。

答案 2 :(得分:0)

正如@JRLambert已经提到的那样,你可以在同一个核心上运行许多线程。

当您在.NET应用程序中生成新线程时,实际上并不是多线程 - "任务"一点都不发生了什么是时间切片。您的CPU将不断在不同的线程之间切换,让它们看起来像是并行工作。但是,核心只能在任何给定时间在单个线程上工作。

例如,当实现任务并行库(TPL)并且您的计算机具有多个核心时,您将看到核心获得的分布式工作负载更加平均,而不是简单地生成新线程。微软真的用TPL做了一些很棒的工作来简化多线程异步环境,而不必像过去那样对线程池和同步原语做大量工作。

看看这个youtube video,他很好地描述了时间切片与多任务。

如果您还不熟悉TPL,那么Sacha Barber在CodeProject上有一个精彩的系列。