它就像一个线程池上下文。我有一个全局原子变量,它指示工作线程是否应该退出:
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
}
是否有其他有效的方法(具有更好的性能,更低的延迟)来检查我们是否应该退出工作线程?
exit.load()
可以是exit.load(relaxed)
,如果任何线程频繁写入同一缓存行中的任何内容,则这是非常便宜的。 即,在没有错误共享的情况下,每个线程都可以将缓存行置于 MESI 共享状态,并通过加载它来获得 L1d 缓存命中。 (或者至少 L2 或 L3 命中,如果你在检查之间做了很多工作。)
relaxed
加载不需要任何额外的排序或障碍,因此它们与访问非原子全局变量一样便宜(在循环持续时间内无法将其优化到寄存器的情况下。)
相关:如果使用“memory_order_relaxed”检查,为什么要使用“memory_order_seq_cst”设置停止标志?