Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在lambda表达式中使用std::atomic_C++_Lambda_C++17_Atomic - Fatal编程技术网

C++ 在lambda表达式中使用std::atomic

C++ 在lambda表达式中使用std::atomic,c++,lambda,c++17,atomic,C++,Lambda,C++17,Atomic,我想在lambda表达式中捕获一个std::atomic。原子变量的生存期必须与lambda绑定,因此我无法通过引用捕获,但我希望避免堆分配 如何修改以下代码段以使其按预期编译和运行? #include <atomic> int main() { std::atomic_int a{42}; auto check = [a] () mutable { return a.fetch_sub(1) == 1; }; // ^ error:

我想在lambda表达式中捕获一个
std::atomic
。原子变量的生存期必须与lambda绑定,因此我无法通过引用捕获,但我希望避免堆分配

如何修改以下代码段以使其按预期编译和运行?

#include <atomic>

int main()
{
    std::atomic_int a{42};
    auto check = [a] () mutable { return a.fetch_sub(1) == 1; };
    //            ^ error: call to deleted constructor of 'std::atomic_int'
}
#包括
int main()
{
std::原子_int a{42};
自动检查=[a]()可变{返回a.fetch_sub(1)==1;};
//^error:调用已删除的“std::atomic\u int”构造函数
}

您可以直接初始化捕获,并依靠C++17保证的复制/移动省略:

#include <atomic>

int main()
{
    auto check = [a = std::atomic_int(42)]() mutable {
        return a.fetch_sub(1) == 1;
    };
}
#包括
int main()
{
自动检查=[a=std::atomic_int(42)]()可变{
返回a.fetch_sub(1)==1;
};
}

为什么生命必须与lambda联系在一起?原子类型的要点是在线程之间共享它们(主线程和一些异步的东西,在这里您将调用lambda——在您的例子中)。这意味着您计划使异步操作比主线程运行更长的时间,这似乎不是一个好的设计。@pptaszni该代码段仅说明了我正在尝试做的事情以及我遇到的错误。我的意图是将lambda存储在由多个线程访问的共享状态中。共享状态是泛型的,并且接受任何可调用的,因此我无法将原子直接存储在共享状态中(不过这会解决我的问题)。我猜可调用的不能接受任何参数(比如
std::atomic_int&
)?然后,您可以将原子变量保留为线程之间共享的类的字段(可能是静态的)。如果不知道你到底想做什么,就很难给出准确的答案。至于你问题中的片段——答案很简单:你不能复制原子类型,你必须将它作为引用传递。但是你为什么要这样做呢?这只是将问题提高了一个层次,现在lambda本身必须以某种方式在线程之间共享,可能具有相同的限制。它现在是不可复制和不可修改的。你刚才批评了你自己的答案吗?@pptaszni我提出了一个解决问题的方案,如前所述,然后批评了整个前提。将一个原子直接塞进一个可调用函数中以避免生命周期问题和动态分配将使它很难使用。可以创建一个可调用类以完全避免lambda捕获问题,但它将显示相同的属性。