gpt4 book ai didi

c++ - std::future 作为返回类型的未定义行为?

转载 作者:太空狗 更新时间:2023-10-29 20:57:20 24 4
gpt4 key购买 nike

在我的例子中,我使用 std::future 作为返回类型,但得到了未定义的行为。代码如下:

#include <future>
#include <iostream>
#include <pthread.h>

std::future<bool> update() {
int c = 1;
//std::cout << "?" << c << std::endl; // debug line
auto lambda = [&] () -> bool {
int b = 0;
for(int i = 0; i < 10000000; ++i) {
b += 1;
}
std::cout << "?" << c << std::endl;
return c == 1;
};
return std::async(std::launch::async, lambda);
}

int main(int argc, char *argv[])
{
auto f2 = update();
std::cout << f2.get() << std::endl;
return 0;
}

我通过g++-4.7.2 -std=c++11 test_future.cc -lpthread编译这段代码,得到如下输出结果:

?0
0

但是当我取消注释上面的 debug line 时,输出变成了 1(如预期的那样)。此外,如果我使用std::future作为参数与update函数一起使用而不是返回值,我也可以获得正确的输出结果。

我想知道这里有什么问题。 g++的bug还是用法的bug?谢谢。

最佳答案

问题是您通过引用捕获了变量 c,同时您还异步运行了 lambda。最后一部分意味着 update 函数可能在 lambda 实际运行之前返回,并且它现在引用了一个不再存在的变量。

如果您有调试行,它似乎可以工作的原因是未定义的行为

所以这个问题与你返回 std::future 没有任何关系。

显而易见的解决方案当然是通过值来捕获 c,如果在您的实际代码中不可能,那么您可能不得不重新考虑您的设计。

关于c++ - std::future 作为返回类型的未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31049078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com