我想知道1个C#线程是否以1个CPU线程为例:
如果你的cpu有8个线程t.ex:4790k并且你启动2个新的c#线程你会失去2个线程吗?比如8 - 2 = 6?
答案 0 :(得分:2)
线程不是核心。在您提供的情况下,您的计算机有8个核心(4个物理和4个逻辑),可以处理线程。计算机可以同时处理数百个线程,并且可以非常快速地切换它们。如果在C#应用程序中创建Thread
类,它将创建一个新的线程,该线程将在CPU上的任何内核上执行。你拥有的核心越多,你的计算机运行得越快,因为它可以同时处理更多的线程(计算机的速度还有其他因素,那么你拥有多少核心)。
答案 1 :(得分:2)
ready queue
中),但CPU只有那么多线程可供使用,因此有些线程仍在等待,直到他们的权重是操作系统调度程序的内部指标,决定轮到他们
您可以查看此文档以获取更多信息:https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt
确实在讨论中找到了有用的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上有一个精彩的系列。