检查是否应该退出工作线程的有效方法

问题描述 投票:0回答:1

它就像一个线程池上下文。我有一个全局原子变量,它指示工作线程是否应该退出:

atomic<bool> exit;

这样的工作线程是这样循环执行的:

while (true) {
  std::unique_lock lock{mut};
  cv.wait(lock, [] {
    return !queue.empty() || exit.load();
  };

  if (exit.load()) {
    return;
  }

  // take task from queue
}

是否有其他有效的方法(具有更好的性能,更低的延迟)来检查我们是否应该退出工作线程?

multithreading concurrency c++17 threadpool atomic
1个回答
0
投票

exit.load()
可以是
exit.load(relaxed)
,如果任何线程频繁写入同一缓存行中的任何内容,则这是非常便宜的。 即,在没有错误共享的情况下,每个线程都可以将缓存行置于 MESI 共享状态,并通过加载它来获得 L1d 缓存命中。 (或者至少 L2 或 L3 命中,如果你在检查之间做了很多工作。)

relaxed
加载不需要任何额外的排序或障碍,因此它们与访问非原子全局变量一样便宜(在循环持续时间内无法将其优化到寄存器的情况下。)

相关:如果使用“memory_order_relaxed”检查,为什么要使用“memory_order_seq_cst”设置停止标志?

© www.soinside.com 2019 - 2024. All rights reserved.