【问题标题】:When to use multithreading in C++? [closed]何时在 C++ 中使用多线程? [关闭]
【发布时间】:2014-03-21 01:54:31
【问题描述】:

我是 C++ 程序员(中级),现在正在学习多线程。我发现什么时候在 C++ 中使用多线程很令人困惑?我怎么知道我需要在哪个部分使用多线程?

When to use multithreading in C++?

【问题讨论】:

  • 只有当你绝对必须这样做时:) 虽然常见的情况是如果你正在构建一个接受套接字请求的服务器。每个套接字通常都需要自己的线程(有替代方案,但它们可能很复杂)。在其他情况下,您有很多繁重的工作要做。像编码视频。您可以将工作拆分到多个 CPU 内核上。基于计时器触发发生的事情。也是线程的良好候选者。但除非有明显的优势,否则不要使用它们。线程间通信可能很复杂并会产生细微的错误。
  • 这是重复的,因为使用 C++ 与问题无关。
  • @Martin - 好吧,部分。不同的语言使线程或多或少变得困难。对于 C++,我会说 AVOID,Java 你可能会说,而对于 Go,答案可能是“你不需要”:)
  • @SlipperySeal:使它“你不必”的语言实际上在后台处理它(至少我有经验的那些不包括 Go,例如 javascript )。 C++ 只是让所有底层的东西变得明确,而且这不是微不足道的。

标签: c++ multithreading


【解决方案1】:

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

嗯 - 一般的经验法则是:当它可以加速您的应用程序时使用它。答案并不依赖于语言。

如果你想得到一个深入的答案,那么你必须考虑一些事情:

  1. 多线程可以在您的代码中实现吗?您是否有可以同时计算且独立于其他计算的片段?
  2. 多线程值得实现吗?即使您已尽一切努力使其尽可能快,您的程序是否运行缓慢?
  3. 您的代码会在支持多线程(因此有多个处理单元)的机器上运行吗?如果您正在为某种只有一个内核的机器设计代码,那么使用多线程就是浪费时间。
  4. 是否有不同的选项?更好的算法,清理代码等?如果是这样 - 也许使用它而不是多线程会更好?
  5. 您是否必须及时处理难以预测的事情,而整个应用程序必须不断运行?例如 - 在游戏中从服务器接收一些信息?

【讨论】:

    【解决方案2】:

    当您有大量的数学计算等资源密集型任务或读取或写入文件等 I/O 密集型任务时,应使用多线程。

    目的应该是,您可以同时运行多个事物(任务),从而提高应用程序的性能和响应能力。此外,在应用程序中实现多线程之前了解同步。

    【讨论】:

      【解决方案3】:

      多线程是多任务处理的一种特殊形式,多任务处理是允许您的计算机同时运行两个或多个程序的功能。

      我认为这个链接可以帮助你。

      http://www.tutorialspoint.com/cplusplus/cpp_multithreading.htm

      【讨论】:

        【解决方案4】:

        主要是当您希望同时完成一些事情时。例如,您可能希望一个窗口在游戏中加载关卡或一次下载多个文件时仍然响应用户输入等。这是为了真正不能等到其他处理完成的事情。当然,结果可能两者都变慢了,但它确实给人一种同时发生多件事的错觉。

        【讨论】:

          【解决方案5】:

          这是一个稍微主观的主题......但我倾向于在两种情况之一中使用多线程。

          1 - 在需要最大功率(并且算法当然支持并行性)的性能关键情况下,对我来说,矩阵乘法。

          2 - 很少有线程管理相当独立的东西可能更容易。经典的是网络,可能有一个线程阻塞等待连接并产生线程来管理每个线程。这很有用,因为线程可以及时阻塞和响应。假设您有一台服务器,一个请求可能需要访问磁盘很慢,另一个线程可以在第一个等待其数据时跳转到一个字段中的不同请求。

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

          【讨论】:

            【解决方案6】:

            当您可以通过并行处理来加速算法时,请使用多线程。当线程需要访问父进程的资源时,使用它来反对多处理。

            【讨论】:

              【解决方案7】:

              我的两分钱。

              用例:

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

              建议:

              1. 在一般情况下,如果单线程解决方案就足够了,则不要执行多线程。它增加了复杂性。
              2. 需要时,从高阶原语开始,例如std::futurestd::async
              3. 尽可能避免数据共享,这是争用的根源。
              4. 当进入较低级别的抽象时,例如互斥锁等,将其封装在某种模式中。你可以看看these slides
              5. 将您的函数与线程分离,并在稍后将线程组合到函数中。也就是说,不要将线程创建嵌入到代码的逻辑中。

              【讨论】:

                猜你喜欢
                • 2010-09-13
                • 2013-10-03
                • 2010-09-21
                • 1970-01-01
                • 2012-03-27
                • 1970-01-01
                • 2020-09-12
                • 1970-01-01
                • 2018-01-11
                相关资源
                最近更新 更多