C++多线程执行速度减慢

发布于 2024-11-01 18:50:15 字数 77 浏览 0 评论 0原文

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

I am writing a multi-threaded c++ application. When thread A has a very computationally expensive operation to perform, it slows down threads B, C, and D. How can I prevent this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

め可乐爱微笑 2024-11-08 18:50:15

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

On windows you can use Sleep(0) to release the remainder of your timeslice for other threads that are waiting.

烦人精 2024-11-08 18:50:15

没有看到代码很难判断,所以我只能给你建议降低线程 A 的优先级。这可以使用 SetThreadPriority 来完成功能。

Hard to tell without seeing code so I can only give you the advice to lower Thread A's priority. This can be done using the SetThreadPriority function.

青萝楚歌 2024-11-08 18:50:15

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

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

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

0.02 美元

Note that you can set the thread priorities (SetThreadPriority)

Also, I advice the backgroundworker picks it's work from a queue. The queue can then be used as a way to throttle the calculations:

  • you can configure how many 'tasks' are taken from the queue for processing in one swoop
  • you can lock the queue (use semaphores + condition event) so you can temporarily prevent new tasks from being picked up.
  • you can now distribute the load across more workers (say if thread B, C, D are temporarily idle, they can start to lift the work off thread A; very useful on a Quad-core + desktop)

$0.02

韵柒 2024-11-08 18:50:15

有几种方法:

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

There are a couple of ways:

  • As RedX suggested, add Sleep(0) in thread A's inner loop to have it yield time more frequently. This is the cheap and lazy solution.
  • Better would be to change the thread priority. When you call CreateThread, pass CREATE_SUSPENDED so that the thread does not start immediately. Then call SetPriorityClass to set the thread to a lower priority, followed by ResumeThread.
Bonjour°[大白 2024-11-08 18:50:15

您可能还想考虑让计算绑定线程将处理器让给其他线程。请参阅这篇文章了解执行此操作的各种方法。

You might also want to look at having your compute-bound thread yield the processor to other threads. See this post for various ways to do this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文