什么是需要多线程或不需要的应用程序的具体示例,但是这样的方式要好得多?
答案是最好的,如果以每个帖子的一个申请的形式,那么最适用的将浮动到顶部.
没有硬性和快速的答案,但大多数时候,对于工作流程/计算是连续的系统,您将看不到任何优势.但是,如果问题可以分解为可以并行运行的任务(或者问题本身是大规模并行的[因为某些数学或分析问题]),您可以看到大的改进.
如果您的目标硬件是单处理器/核心,那么您不太可能看到多线程解决方案有任何改进(因为无论如何一次只运行一个线程!)
编写多线程代码通常比较困难,因为您可能需要花时间创建线程管理逻辑.
一些例子
图像处理通常可以并行完成(例如,将图像分成4并在1/4的时间内完成工作),但这取决于运行的算法以查看是否有意义.
动画的渲染(来自3DMax等)是大规模并行的,因为每个帧可以独立呈现给其他人 - 这意味着可以将10或100的计算机链接在一起以提供帮助.
GUI编程通常有助于在执行缓慢操作时至少有两个线程,例如处理大量文件 - 这允许接口在工作人员进行艰苦工作时保持响应(在C#中,BackgroundWorker就是此示例)
GUI是一个有趣的领域,因为如果工作者算法通过给它时间保持主GUI"活着",可以维持界面的"响应性",在Windows API术语中(在.NET之前等),这可能是通过原始循环实现,无需线程:
MSG msg; while(GetMessage(&msg, hwnd, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); // do some stuff here and then release, the loop will come back // almost immediately (unless the user has quit) }
服务器通常是多线程的(Web服务器,radius服务器,电子邮件服务器,任何服务器):您通常希望能够同时处理多个请求.如果您不想在开始处理新请求之前等待请求结束,那么您主要有两个选择:
运行具有多个线程的进程
运行多个进程
启动进程通常比启动线程(或在线程池中选择一个)更耗费资源,因此服务器通常是多线程的.而且,线程可以直接通信,因为它们共享相同的内存空间.
多线程的问题在于它们通常比多个进程更难编码.
实际上有多种原因可以应用多线程:
执行并发以提高计算性能:如果您遇到的问题可以分解为多个并且您还有多个执行单元(处理器核心)可用,那么将这些部分分配到单独的线程中是可以同时使用两个的路径一次或多个核心.
CPU和IO操作的并发性:这与第一个类似,但在这种情况下,目标是保持CPU忙,并且IO操作(即:磁盘I/O)并行移动而不是在它们之间交替.
程序设计和响应性:许多类型的程序可以利用线程作为程序设计的好处,使程序对用户更敏感.例如,程序可以通过GUI进行交互,也可以在后台执行某些操作.
具体例子:
Microsoft Word:编辑文档,而背景语法和拼写检查工具可以添加所有绿色和红色的波浪线下划线.
Microsoft Excel:单元格编辑后自动重新计算背景
Web浏览器:在单个页面加载期间,分派多个线程以并行加载多个HTML引用.加速页面加载并最大化TCP/IP数据吞吐量.
这些天,答案应该是可以的任何应用程序.
单个线程的执行速度几年前达到了顶峰 - 处理器通过添加内核而不是通过提高时钟速度而变得更快.已经有一些架构改进可以更好地利用可用的时钟周期,但实际上,未来正在利用线程.
有很多研究正在寻找并行化我们传统上不会想到并行化的活动的方法.甚至像在字符串中查找子字符串这样简单的东西也可以并行化.