【发布时间】:2010-02-06 04:41:36
【问题描述】:
我有一些关于线程的问题:
- 在降低应用程序性能之前,进程允许的最大线程数是多少?
- 如果有限制,如何更改?
- 在多线程应用程序中是否有理想的线程数?如果这取决于应用程序在做什么,您能举个例子吗?
- 影响这些性能/线程限制的因素有哪些?
【问题讨论】:
标签: c++ multithreading unix
我有一些关于线程的问题:
【问题讨论】:
标签: c++ multithreading unix
这实际上是一组很难回答的问题,没有绝对的答案,但以下应该作为适当的近似值:
它是您的应用程序行为和运行时环境的函数,只能通过实验推断。通常有一个阈值,在该阈值之后,您的性能实际上会随着线程数的增加而下降。
通常,在找到限制之后,您必须弄清楚如何重新设计您的应用程序,以使每线程成本不那么高。 (请注意,对于某些领域,您可以通过重新设计算法并减少线程数来获得更好的性能。)
没有一般的“理想”线程数,但您有时可以为特定运行时环境中的应用程序找到最佳线程数。这通常通过实验来完成,并绘制基准结果的图表,同时改变以下内容:
影响线程限制的因素有很多,但最常见的有:
【讨论】:
问题 1、3 和 4 的答案是“它取决于应用程序”。根据您的线程所做的事情,您可能需要不同的数量来最大限度地提高应用程序的效率。
至于问题 2,几乎可以肯定是有限制的,而且不一定是你可以轻易改变的。每个用户的并发线程数可能受到限制,或者内核中可能存在允许的最大线程数。
【讨论】:
【讨论】:
只要您使用 CPU 时间的线程数永远不会超过内核数,您将获得最佳性能,但是一旦您必须等待 I/O 就会有未使用的 CPU 周期,因此您可能想要分析您的应用程序,并查看它花费最大 CPU 时间的等待部分,以及等待 RAM、硬盘、网络和其他 IO 的部分,一般来说,如果您正在等待 I/O,您可能还有 1 个线程(前提是您主要受 CPU 限制)。
对于硬性和绝对限制,请查看 limits.h 中的 PTHREAD_THREADS_MAX,这可能就是您要查找的内容。在某些系统上可能是 POSIX_THREAD_MAX。
【讨论】:
任何应用程序的繁忙线程数超过处理器数量都会导致整体速度变慢。有上限,但因系统而异。对于某些人来说,它曾经是 256,您可以重新编译操作系统以使其更高一些。
【讨论】:
只要线程被设计为执行单独的任务,那么问题就不大了。但是,当这些线程与资源相交时,问题就开始了,此时应该实现锁定机制。
【讨论】: