什么类型的应用程序需要多线程?

时间:2009-01-18 12:57:30

标签: multithreading

什么是某些具体示例的应用程序需要多线程,或者不需要,但这样做要好得多?

如果以每个帖子的一个申请表的形式回答最好,那么最适用的将浮动到顶部。

15 个答案:

答案 0 :(得分:20)

没有硬性和快速的答案,但大多数情况下,对于工作流程/计算是连续的系统,您将看不到任何优势。但是,如果问题可以分解为可以并行运行的任务(或者问题本身是大规模并行的[因为某些数学或分析问题]),你可以看到很大的改进。

如果您的目标硬件是单处理器/核心,您不太可能看到多线程解决方案有任何改进(因为一次只运行一个线程!)

编写多线程代码通常比较困难,因为您可能需要花时间创建线程管理逻辑。

一些例子

  • 图像处理通常可以并行完成(例如将图像拆分为4并在1/4的时间内完成工作)但这取决于运行的算法是否有效感。
  • 动画的渲染(来自3DMax等)是大规模并行的,因为每个帧可以独立呈现给其他人 - 这意味着10或100的计算机可以链接在一起帮助。 / LI>
  • 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)
}

答案 1 :(得分:15)

服务器通常是多线程的(Web服务器,radius服务器,电子邮件服务器,任何服务器):您通常希望能够同时处理多个请求。如果您不想在开始处理新请求之前等待请求结束,那么您主要有两个选择:

  1. 运行具有多个线程的进程
  2. 运行多个流程
  3. 启动进程通常比启动线程(或在线程池中选择一个)更耗费资源,因此服务器通常是多线程的。而且,线程可以直接通信,因为它们共享相同的内存空间。

    多线程的问题在于它们通常比多个进程更难编码。

答案 2 :(得分:8)

有多种原因可以应用多线程:

  • 执行并发以提高计算性能:如果您遇到的问题可以细分为多个,并且您还有多个执行单元(处理器核心)可用,那么将这些部分分配到单独的线程中是一次能够同时使用两个或多个核心的途径。
  • CPU和IO操作的并发性:这与第一个类似,但在这种情况下,目标是保持CPU忙碌以及IO操作(即:磁盘I / O)并行移动而不是在它们之间交替。
  • 程序设计和响应性:许多类型的程序可以利用线程作为程序设计优势,使程序对用户更具响应性。例如,程序可以通过GUI进行交互,也可以在后台执行某些操作。

具体例子:

  • Microsoft Word :编辑文档,而后台语法和拼写检查功能可以添加所有绿色和红色的波浪线下划线。
  • Microsoft Excel :单元格修改后自动重新计算背景
  • Web浏览器:在单个页面加载期间,分派多个线程并行加载多个HTML引用。加速页面加载并最大化TCP / IP数据吞吐量。

答案 3 :(得分:5)

现在,答案应该是任何可以的应用程序。

单个线程的执行速度几年前达到了顶峰 - 处理器通过添加内核而不是通过提高时钟速度而变得更快。已经有一些架构改进可以更好地利用可用的时钟周期,但实际上,未来正在利用线程。

有很多研究正在寻找并行化我们传统上不会想到并行化的活动的方法。即使是在字符串中查找子字符串这么简单的事情也可以并行化。

答案 4 :(得分:4)

多线程基本上有两个原因:

  1. 能够并行执行处理任务。这仅适用于具有多个核心/处理器的情况,否则在单核心/处理器计算机上,与没有线程的版本相比,您将减慢任务速度。

  2. I / O是网络I / O还是文件I / O.通常,如果您调用阻塞I / O调用,则进程必须等待调用完成。由于处理器/内存比磁盘驱动器快几个数量级(并且网络甚至更慢),这意味着处理器将等待很长时间。计算机将处理其他事情,但您的应用程序将不会取得任何进展。但是,如果您有多个线程,计算机将安排您的应用程序,其他线程可以执行。一个常见用途是GUI应用程序。然后,当应用程序正在执行I / O时,GUI线程可以保持刷新屏幕,而不会看起来应用程序被冻结或没有响应。即使在单个处理器上,将I / O放在不同的线程中也会使应用程序加速。

  3. 2的单线程替代方法是使用异步调用,它们会立即返回并继续控制您的程序。然后,您必须查看I / O何时完成并使用它进行管理。使用同步调用使用线程来执行I / O通常更简单,因为它们往往更容易。

    使用线程而不是单独进程的原因是因为线程应该比多个进程更容易共享数据。有时在线程之间切换比在进程之间切换要便宜。

    另外注意,#1 Python线程不起作用,因为在Python中一次只能执行一条python指令(称为GIL或全局解释器锁)。我以此为例,但您需要检查一下您的语言。在python中,如果要进行并行计算,则需要执行单独的过程。

答案 5 :(得分:3)

许多GUI框架都是多线程的。这使您可以拥有一个响应更快的界面。例如,您可以在长计算运行时随时单击“取消”按钮。

请注意,还有其他解决方法(例如,程序可以每半秒暂停一次计算以检查是否单击了“取消”按钮),但它们不提供相同级别的响应(在读取文件或进行计算时,GUI可能会冻结几秒钟。

答案 6 :(得分:3)

到目前为止,所有答案都集中在多线程或多处理是充分利用现代硬件所必需的事实。

然而,还有一个事实是,多线程可以让程序员更轻松地生活。在工作中,我编写软件来控制制造和测试设备,其中单个机器通常由多个并行工作的位置组成。对于那种软件使用多个线程是很自然的,因为并行线程很好地模拟了物理现实。线程通常不需要交换任何数据,因此需要同步线程很少,因此多线程难以解决的许多原因因此不适用。

修改

这并不是关于性能提升,因为(可能是5个,可能是10个)线程大部分都在休眠。然而,当各种并行过程可以被编码为彼此不知道的动作序列时,对于程序结构是一个巨大的改进。我从16位Windows的时代得到了非常糟糕的回忆,当我为每个机器位置创建状态机时,确保不会花费超过几毫秒的时间,并且不断地将控制传递给下一个状态机。当需要按时服务的硬件事件,以及需要一段时间的计算(如FFT)时,事情就会变得非常快速。

答案 7 :(得分:2)

不直接回答你的问题,我相信在不久的将来,几乎每个应用程序都需要多线程。如今,CPU性能并没有快速增长,这可以通过越来越多的内核来补偿。因此,如果我们希望我们的应用程序在性能方面保持最佳状态,我们需要找到利用所有计算机CPU的方法并让它们保持忙碌,这是一项非常艰苦的工作。

这可以通过告诉你的程序做什么而不是告诉他们具体如何来完成。现在,这是我个人最近发现非常有趣的话题。一些函数式语言,如F#,能够非常容易地并行化许多任务。嗯,不是那么容易,但仍然没有在更多程序风格的环境中所需的必要基础设施。

请将此作为补充信息进行思考,而不是尝试回答您的问题。

答案 8 :(得分:1)

需要 进行线程化的应用程序类型是您希望同时执行多项操作的应用程序。除此之外,没有任何应用程序需要多线程。

答案 9 :(得分:1)

工作量大的应用程序,可轻松实现并行。不应低估接受申请和执行此操作的难度。当您操作的数据不依赖于其他数据时很容易,但是当存在依赖时很难安排跨线程工作。

我做过的一些例子是好的多线程候选人..

  • 运行方案(例如股票衍生品定价,统计数据)
  • 批量更新数据文件(例如,向10,000条记录添加值/条目)
  • 其他数学过程

答案 10 :(得分:0)

,例如,当您想要使用多个内核和/或CPU时,您希望程序是多线程的,即使程序不是必然同时执行多项操作。

编辑:使用多个进程是一回事。使用哪种技术取决于平台以及如何在程序中进行通信等。

答案 11 :(得分:0)

虽然轻浮,但游戏每年都在变得越来越多。在工作中,我们的游戏使用大约10个线程进行物理,AI,动画,渲染,网络和IO。

答案 12 :(得分:0)

只是想补充一点,如果您共享任何资源,必须小心谨慎,因为这会导致一些非常奇怪的行为,并且您的代码无法正常工作,甚至线程互相锁定。

mutex将帮助您,因为您可以使用互斥锁来保护代码区域,受保护代码区域的一个示例是读取或写入线程之间的共享内存。

只需要2美分。

答案 13 :(得分:0)

多线程的主要目的是分隔时域。因此,无论在哪里,您都希望在自己明显独立的时域中发生一些事情。

答案 14 :(得分:0)

这里是完美的使用案例

如果您喜欢会员营销,多线程至关重要。通过多线程应用程序启动整个过程。

通过FTP下载商家文件,解压缩文件,枚举每个文件,执行从Unix到PC CRLF的EOL终结符清理,然后通过大容量插入将它们分别塞入SQL Server,然后在所有线程完成后为文件创建全文本搜索索引明天要上演的环境实例,您的工作就完成了。全部自动在晚上11:00开始。

BOOM!快如闪电。剩下的时间太长了,您甚至可以为要下载的产品在本地下载商户图像,将图像另存为webp并设置产品网址以使用本地图像。

是的,我做到了。用C#编写。奇迹般有效。购买具有256GB内存的AMD Ryzen Threadripper 64核和nvme之类的快速驱动器,让午餐回来,看看一切都完成了,或者只是呆在那儿,观看所有核心钉住95%以上的声音,聆听PC风扇的声音,预热屋子里的东西,当你把狗屎做完时,邻居的灯从外面闪烁着。

未来还将把处理推到GPU上。

好吧,我在邻居灯闪烁的情况下将其推开了一点,但其他所有内容都是正确的。 :)