gpt4 book ai didi

c# - 特定处理器同时运行的线程数是多少?

转载 作者:行者123 更新时间:2023-11-30 19:25:14 29 4
gpt4 key购买 nike

我有一台配备 8 核处理器的计算机,我对我的计算机需要使用您的 8 核处理器的最大线程数(软件,不是处理器线程。)的最大线程数有疑问核。

我正在同时创建 160 个线程,所以我的处理器的每个核心将处理大约 20 个线程,对吗?

我的问题是:

  • 处理器核心 20 个线程是否合适?
  • 独立于运行的线程数,它会除以核心数?
  • 如何知道哪个线程数适合我的处理器?

最佳答案

I'm creating 160 threads simultaneous, so each core of my processor will process about ~20 threads, is it correct?

不完全是。每个核心一次只能处理一个线程。当操作系统决定线程有足够的聚光灯时,它会将它切换到另一个线程。如果您可以在 8 个线程中完成相同的工作,那么您将拥有相同的吞吐量以及避免不必要的上下文切换所带来的节省。

20 threads by core of processor is a good number?

没有。每个核心一个线程是现场。超线程核心大约占两个 - 工作效果各不相同。

Independent the number of threads running, its will be divided equality by the number of cores?

没有。这是由操作系统决定的,操作系统在其决策中往往会考虑很多不同的事情。此外,阻塞的线程不会在任何地方执行。实际上,其中一些线程很可能比其他线程占用更多的 CPU 时间。

How to know whats the better number of threads according with my processor?

使用比线程更高级别的结构。这意味着将线程池用于简单的工作项,将 Parallel.For 和系列用于“同步”并行,将异步 Task 用于复杂的异步工作任务(包括线程池片段) ).确实没有太多理由再手动创建线程 - 除非您真的知道自己在做什么,以及为什么将它放在专用线程上很重要。

关键是这只适用于 CPU 工作。您可以轻松地让一个线程同时处理一百个独立的异步任务。当针对异步 API 使用 await 时,这尤其容易处理。每个 CPU 的单线程可以很容易地让您 100% 的利用率只要它确实在 CPU 工作。如果没有,您无论如何都想使用异步 I/O - 在 等待.

典型的例子是处理一些数据库工作的异步网络服务:

string GetUserName(Guid userId)
{
return Db.GetUser(userId).Name;
}

这个同步方法在处理DB请求的时候会占用请求线程。如果您的数据库请求需要一秒钟,并且您同时有 2000 个请求,那么您将需要 2000 个线程来处理这些请求。然而,数据库请求只是异步 I/O——线程基本上是在等待来自数据库的响应返回。线程被浪费了等待。

相反,您可以使用异步 API:

async Task<string> GetUserName(Guid userId)
{
var user = await Db.GetUserAsync(userId);

return user.Name;
}

代码几乎相同,但是 await 构造实际上并没有阻塞请求线程——它基本上是说“好的,我完成了,你可以用这个线程做别的事情。我当我准备好继续时,我会回复你。”。这种模式意味着您永远不会需要比 CPU 核心更多的线程 - 如果 CPU 处于 100%,则添加更多线程来处理负载是没有意义的。如果不是,则意味着某个线程没有执行任何 CPU 工作——这很好,当另一项工作出现时将使用它。现在,不再是让 2000 个线程处理 2000 个请求,而是让 8 个线程处理相同的 2000 个请求。

关于c# - 特定处理器同时运行的线程数是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30216856/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com