从逻辑上看,应用程序可能需要数十个或数百个线程,其中一些线程将在大多数时间内休眠,但很少有线程将始终同时运行。问题是:产生比系统中的处理器更多的并发线程是否有意义,还是浪费?
我见过一些服务器应用程序,它们实现了一个用于逻辑管理任务(通常称为作业)的调度程序,但也产生了很多线程,因此我没有看到它的好处。
提前致谢。
答案 0 :(得分:23)
不确定。如果您的软件频繁使用磁盘或网络IO,则通常可以通过添加更多线程来提高吞吐量。当其他线程在IO上阻塞时,那些额外的线程将会唤醒并执行操作。
答案 1 :(得分:12)
其他人已经谈到了几乎肯定有意义的情况(当你做任何缓慢的IO时)。
如果出现以下情况, 可能不是一个好主意:
和
在这种情况下,可能会导致不必要的缓存未命中。
答案 2 :(得分:6)
如果
,这可能有意义您的程序设计优势,因为您拥有最佳在线程中实现的并行任务,或者
您的某些线程受I / O约束,因此它们不会自行使用处理器/内核。
答案 3 :(得分:4)
简短回答是“是”。
即使你认为你可以通过多处理器环境中的多线程获得更多,它仍然是单处理器机器上的一项有用技术,主要是因为它意味着你将一些工作委托给流程调度程序,谁应该有比你更好的信息有。
如果你没有多线程,你最终会自己完成调度工作,如果这是你需要的,这可能是一件好事,但很可能既乏味又低效
答案 4 :(得分:3)
每当你有一个等待I / O操作的任务时,将它封装在一个线程中并将其激活是有意义的。在等待I / O操作完成时,您的线程很可能会被挂起。当它被唤醒时,结果将等待它。
答案 5 :(得分:3)
其中一个好处是当您升级硬件时,可能会获得更多处理器/核心。
答案 6 :(得分:2)
因为所有现代操作系统都是多任务处理:每个线程从处理器获得时间共享。它实际上不是并发执行,但考虑到处理器每秒可以处理数千个请求,这是一个“明显的”并发执行。
所以是的,如果案例需要,它对单个处理器上的多线程确实有意义。
答案 7 :(得分:1)
我发现在编写通过网络处理大量数据集的数据解析器时,最好为字母表中的每个字母(与数据相关)创建一个线程,并使程序更多地受CPU和内存限制。 I / O有限性继承了网络和磁盘操作是一个主要的瓶颈,所以你也可以“开始”其他数据文件而不是顺序完成工作。
在四核上,启动超过四个线程肯定是有意义的。这四个线程不太可能分布在多个核心上,尤其是当今的处理器速度。
答案 8 :(得分:1)
根据Herb Sutter(并发领域的主要专家之一),其中一个Pillars of Concurrency是响应和通过异步代理隔离。摘要是:
通过独立运行任务和异步执行任务,通过消息进行通信来保持响应。
伟大的文章(和整个系列!)。我还在等着这本书。