可从外部停止的 C++ lambda 线程

C++ lambda thread stoppable from outside

我正在尝试创建一个等待的辅助线程,works/finishes 如果主线程这么说的话。

像这样:

std::atomic<bool> quit(false), doit(false);

std::thread([quit, doit]()
{
  while (!quit)
  {
    wait();
    if (doit)
      std::cout << "done";
  }
}

编译器说:

1.cpp:26:15: error: call to implicitly-del
eted copy constructor of 'atomic<bool>'
    thread t([quit, doit, ,                   ^~~~~~                      /data/data/com.termux/files/usr/include/c+
+/v1/atomic:1643:7: note: copy constructor of 'atomic<bool>' is implicitly deleted b
ecause base class '__atomic_base<bool>' has a deleted copy constructor                  : public __atomic_base<_Tp>

隐式删除的目的是什么,为什么它在这里很重要? 另外:我还应该使用什么(而不是互斥体)?

std::thread([quit, doit]()

暂时搁置编译错误:这说明这个lambda捕获了这个doit变量.因此,即使编译错误神奇地消失了,最终结果也将是完全无用且永远无法工作的东西。 lambda 将要做的就是一遍又一遍地检查其捕获的 doit 对象,这是一个与“真实”doit 对象完全不同且独立的对象(因为这就是 lambda 捕获 按价值 工作,毕竟),没有人会设置,直到时间结束。

如果 doit 是一个全局对象,则不需要捕获它。如果不是,如果它有局部作用域,lambda 应该通过引用 捕获它 (使用前面的 &-thingy其中)。然后您将必须以某种形式或方式确保本地范围不会终止,直到此执行线程停止,或者至少(以某种方式)它将不再逻辑上访问按引用捕获的对象,所以它可以在它原来的范围内销毁。