可从外部停止的 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其中)。然后您将必须以某种形式或方式确保本地范围不会终止,直到此执行线程停止,或者至少(以某种方式)它将不再逻辑上访问按引用捕获的对象,所以它可以在它原来的范围内销毁。
我正在尝试创建一个等待的辅助线程,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其中)。然后您将必须以某种形式或方式确保本地范围不会终止,直到此执行线程停止,或者至少(以某种方式)它将不再逻辑上访问按引用捕获的对象,所以它可以在它原来的范围内销毁。