【问题标题】:C++ Multi-Thread Execution Speed Slow-DownC++ 多线程执行速度变慢
【发布时间】:2011-04-13 14:49:15
【问题描述】:

我正在编写一个多线程 C++ 应用程序。当线程 A 执行计算量非常大的操作时,它会减慢线程 B、C 和 D。我该如何防止这种情况发生?

【问题讨论】:

  • 您的系统有多少个内核?如果你的核心少于 4 个,那么一些核心将不得不在多个线程之间共享,这意味着一个线程的成本会影响其他线程......
  • 我有 4 个核心。它是英特尔 i7。
  • 4 个核心和一个线程会减慢其他线程的速度?要么你没有正确测量,要么线程在逻辑上相互锁定(也就是说,不是计算时间减慢了它)。因此sleep 可能无济于事。
  • 定义:“它会减慢线程 B、C、D 的速度” 你如何衡量这个? 4 核并不意味着应用程序将在 4 个线程下以最佳方式运行。请记住,系统正在运行一大堆其他进程,每个进程都有自己的线程。

标签: c++ windows multithreading


【解决方案1】:

在 Windows 上,您可以使用 Sleep(0) 为正在等待的其他线程释放剩余的时间片。

【讨论】:

  • 这是我的建议 - 会减慢线程 A,因此如果计算时间紧迫,则不应使用
  • 鉴于他有 4 个内核,一个线程的 CPU 开销不可能减慢其他线程的速度,这样sleep 确实会有所帮助。他可能有一些糟糕的锁定语义。 虚假分享也是可能的,但通过性能测试很难注意到
【解决方案2】:

不看代码很难说,所以我只能给你建议降低线程 A 的优先级。这可以使用SetThreadPriority 函数来完成。

【讨论】:

    【解决方案3】:

    注意可以设置线程优先级(SetThreadPriority

    另外,我建议后台工作人员从队列中选择它的工作。然后可以将队列用作限制计算的一种方式:

    • 您可以一次性配置从队列中取出多少“任务”进行处理
    • 您可以锁定队列(使用信号量 + 条件事件),这样您就可以暂时阻止新任务被拾取。
    • 您现在可以将负载分配给更多的工作人员(例如,如果线程 B、C、D 暂时空闲,他们可以开始从线程 A 上转移工作;在四核 + 桌面上非常有用)

    0.02 美元

    【讨论】:

      【解决方案4】:

      有几种方法:

      • 按照 RedX 的建议,在线程 A 的内部循环中添加 Sleep(0) 以使其更频繁地产生时间。这是便宜又懒惰的解决方案。
      • 最好更改线程优先级。当您调用CreateThread 时,传递CREATE_SUSPENDED 以便线程不会立即启动。然后调用SetPriorityClass将线程设置为较低的优先级,然后调用ResumeThread

      【讨论】:

      • 优先级较低的它也会被其他系统进程中断。使用 sleep(0) 您仍然可以为所有线程设置高优先级,并使用 Sleep 将剩余时间分配给这些线程。 (希望这是有道理的)
      • @RedX,你的评论是错误的。当您Sleep(0) 时,当前正在执行的线程被挂起,但绝对不能保证下一个要运行的线程来自您的进程。因此,无论哪种方式,您都可能将时间花在系统线程上。
      【解决方案5】:

      您可能还想看看让您的计算密集型线程将处理器让给其他线程。请参阅this post 了解执行此操作的各种方法。

      【讨论】:

        猜你喜欢
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 2016-04-07
        • 2019-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多