【问题标题】:Threads, why 1000 threads and 2000 threads does not make much noticeable difference [duplicate]线程,为什么 1000 个线程和 2000 个线程没有太大的区别 [重复]
【发布时间】:2017-10-14 18:28:25
【问题描述】:

使用线程可以显着提高性能,因为有更多的“工人”来执行工作。但是,我进行了测试并注意到它是前几个线程对性能的影响最大。

为什么大量线程的时间几乎是恒定的,比如 1000 和 2000 个线程?

是不是因为没有足够的工作要做,所以大多数人都在睡觉等待工作弹出?

编辑: 我在 C 中创建了一个多线程查找器,它仅用作 bash 中的 find 命令。我花了一些时间处理不同数量的线程(phread_create),并注意到我只通过创建几个线程就可以获得最大的性能影响。但是,40 线程和 600 线程的时间几乎相同。为什么会这样?

谢谢

【问题讨论】:

  • 不,这是因为没有足够的工人。你的cpu有2000个核心吗?这就是为什么。
  • 除非您有数百个 CPU 内核创建超过一千个线程,否则只会浪费系统资源。操作系统将在您的线程之间进行更多的切换,而不是线程本身有时间运行。您创建的线程越多,线程运行的时间就越少。
  • 如果没有更多上下文和细节,这并不是一个真正有意义的问题,尤其是考虑到“线程”的不同可能含义。
  • 抱歉不清楚,我已经编辑并添加了更多文本来解释我想问的内容。 @GSerg
  • 我希望评论/回答此类问题的 SO 用户在声明线程 CPU 开销时指定“就绪/运行”线程。

标签: c multithreading


【解决方案1】:

正如在 cmets 中已经提到的,没有必要拥有比 CPU 内核更多的线程。如果您的线程数多于 CPU 内核数,您实际上会获得更少的性能,因为内核会浪费 CPU 周期切换线程。您拥有的线程越多,在它们之间切换所浪费的时间就越多,至少一般来说,这也与应用程序的性质有关。

此外,当您有许多线程要切换时,您更有可能进行缓存垃圾处理。澄清一下:

当 thread1 执行时,它在 CPU 缓存中拥有自己的数据。但是当切换出去并且thread2进来时,它会从真实内存中读取它的数据(比缓存需要更长的时间)并将其放入缓存中。当 thread1 回来时也会发生同样的事情,它必须再次从真实内存中读取。这将在统计上更频繁地发生,您拥有的线程越多。但同样,这取决于所完成工作的性质,每个线程每次执行时从实际内存中读取多少数据到缓存。

【讨论】:

  • '正如 cmets 中已经提到的,没有必要拥有比 CPU 内核更多的线程'我的系统在这里似乎不同意。 Firefox 有 78 个线程,Skype 56 等等。
  • @Martin James:我还写道,这与应用程序的性质有关。但是出于负载共享的目的,这就是问题所在,没有必要拥有比内核多得多的线程。另一方面,如果您的线程大部分时间都在休眠,并且只唤醒处理特定事件,那么拥有更多线程可能是可行的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2019-08-22
  • 2010-09-17
  • 2019-03-13
  • 2012-08-07
相关资源
最近更新 更多