何时在C++中使用多线程?

3

我是一名C++程序员(中级),现在正在学习多线程。当我使用C++时,我发现很难判断何时需要使用多线程?我该如何知道何时需要在哪个部分使用多线程?

When to use multithreading in C++?

只有在绝对必要的情况下才使用线程 :) 例如,如果您正在构建一个在套接字上接受请求的服务器,则每个套接字通常需要自己的线程(虽然有替代方案,但它们可能很复杂)。其他情况是当您需要进行大量重型工作时,例如编码视频。您可以将工作分配到多个CPU核心上。基于定时器触发的事情也是线程的好选择,但除非有明显的优势,否则不要使用它们。线程间通信可能会很复杂,并且会产生微妙的错误。 - slipperyseal
这是一个重复问题,因为使用C++与问题无关。 - Martin J.
@Martin - 嗯,部分正确。不同的编程语言使得线程更或者更少困难。对于C++,我会说要避免使用;对于Java,你可能会说也许可以;而对于Go,答案可能是“你不需要”。 :) - slipperyseal
@SlipperySeal:那些让你“不必”处理的语言实际上是在底层处理它(至少我有经验的语言是这样的,不包括Go,例如javascript)。C++只是将所有这些底层东西显式化,而且这并不是微不足道的。 - Martin J.
7个回答

3

当您有像巨大的数学计算这样的资源密集型任务,或者像读写文件这样的I/O密集型任务时,应该使用多线程。

目的是可以同时运行多个任务,从而提高应用程序的性能和响应能力。在实现多线程之前,还应了解同步技术。


3
何时在C++中使用多线程?一般的经验法则是:当它可以加速应用程序时使用。答案并不是与语言相关的。如果您想得到深入的答案,那么您需要考虑以下几点:
1. 是否可能在代码中实现多线程?您是否有可以同时计算且独立于其他计算的片段?
2. 实施多线程是否值得?即使您已经尽力使其尽可能快地运行,您的程序是否仍然运行缓慢?
3. 您的代码是否将在支持多线程(因此具有多个处理单元)的机器上运行?如果您正在为某种只有一个核心的机器设计代码,则使用多线程是浪费时间。
4. 是否有其他选项?更好的算法、清理代码等等?如果有,也许使用这些选项而不是多线程更好。
5. 您是否必须处理时间难以预测的事情,而整个应用程序必须不断运行?例如,在游戏中从服务器接收一些信息。

2

这是一个略带主观性的话题... 但我倾向于在以下两种情况下使用多线程。

1 - 在性能关键的情况下,需要最大的计算能力(当然,算法支持并行化),对我来说,矩阵乘法就是这样的情况。

2 - 很少情况下,可能更容易让一个线程管理相当独立的东西。经典的例子是网络,也许有一个线程阻塞等待连接,并生成线程来管理每个进来的线程。这很有用,因为线程可以阻塞并及时响应。假设您有一个服务器,一个请求可能需要慢速的磁盘访问,另一个线程可以跳入并处理不同的请求,而第一个线程正在等待其数据。

正如其他人所说,只有在需要时才考虑使用它,它会很快变得复杂,并且难以调试。


1

1

大多数情况下,当你希望同时完成多项任务时会用到此功能。例如,在游戏中加载关卡或同时下载多个文件时,你可能希望窗口仍然响应用户输入等。这是针对那些真的不能等待其他处理完成的事情。当然,两者可能会变得更慢,但它确实给人一种多个事情同时发生的错觉。


1

当你能够通过并行处理来加快算法时,使用多线程。当线程需要访问父进程的资源时,与 multiprocessing 相对使用。


0

我的两分钱。

使用案例:

  1. 将您的应用程序集成到已经运行循环的lib/app中。如果您无法集成到其他应用程序中,则需要自己的线程来并发运行代码。
  2. 任务拆分。有时将不相交的任务组织在线程中是有意义的,例如将声音与图像处理分离。
  3. 性能。当您想要提高某些任务的吞吐量时。

建议:

  1. 通常情况下,如果单线程的解决方案足以满足需求,请不要使用多线程。这会增加复杂性。
  2. 在需要时,从高阶原语开始,例如std::futurestd::async
  3. 尽可能避免数据共享,这是争用的根源。
  4. 当转向更低级别的抽象时,例如互斥锁等,将其封装在某种模式中。您可以查看这些幻灯片
  5. 将函数与线程分离,并在稍后将线程组合到函数中。即不要将线程创建嵌入到代码逻辑中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接