【问题标题】:How can I make this less cpu intensive?如何降低 CPU 密集度?
【发布时间】:2016-07-11 02:30:10
【问题描述】:

我有一个线程在循环中运行并执行任务。

outTask::Task* task;
while (!m_out_stop) {
    println("abc");
    while (m_outQueue.pop(task)) {
        println("123");
        task->execute();
    }
}

如何降低 CPU 密集度?我可以让线程在每个任务之间休眠,但这会导致延迟,因此不是理想的解决方案。

附言。打印语句用于调试目的。

【问题讨论】:

  • 使用 boost 你可以使用 boost::this_thread::yield()。使用 c++11 你可以使用 std::this_thread::yield()
  • @user5976242 至少在 Windows 上,yield 不会降低 CPU 使用率。如果您让出,但调度程序在该 cpu 上没有其他线程可以调度,它会立即重新调度您的线程,从而限制 cpu。
  • @sbabbi 你是对的。我想我只是不明白这个问题。如果没有其他线程准备好运行,那么我想使用最大 CPU 来完成我的任务(我不在乎它是否是 CPU 密集型的)。但是,如果我的任务占用 CPU 并阻止其他线程顺利响应/运行,那么我会想要让步。
  • 当队列为空并且循环只是不断检查m_out_stop 时,CPU 负载最大,我说对了吗?

标签: c++11 boost boost-thread task-queue


【解决方案1】:

如果您在 Windows 中工作,可以使用 SetThreadPriority:

outTask::Task* task;
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
while (!m_out_stop) {
.....

它使你的工作线程运行最慢,但不会停止它

【讨论】:

  • 谢谢。这是跨平台的吗?
  • 不,我在回答中告诉你(“如果你在 Windows 中工作”)
  • 抱歉,错过了。我的坏
猜你喜欢
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2023-03-27
  • 2016-06-11
相关资源
最近更新 更多