即使调用get(),也不会运行future

时间:2016-04-24 12:12:47

标签: c++ c++11 asynchronous future

我希望并行运行一些system来电,但即使我致电f1.get(),也不会发生以下行中的应对。这段代码有什么问题?

auto f1 = std::async( system, string("cp a b").c_str() );
f1.get(); // there is still no file "b".

注意:我写了string(...).c_str(),因为在我的真实代码中,我正在使用不同字符串中的参数。

1 个答案:

答案 0 :(得分:2)

包含您的命令的std::string是一个临时对象,只会在std::async调用结束前生效, 因此,在调用system时,指针可能会引用可能正常工作的已删除内存,或者它可能会读取rm -rf / --no-preserve-root - 它未定义的行为。

您需要确保字符串对象足够长。在您的示例中,这很容易,但如果您正在启动异步操作,情况并非如此。

C ++ 11 lambda表达式为我们提供了一个很好的方法来存储字符串,只要我们需要它:

std::string command = "cp main.cpp b";

auto f1 = std::async(std::launch::async, 
    [command]{ // copy command into the closure
        std::system(command.c_str()); 
    }
);

另请注意,您没有请求async启动政策,因此您的功能可能会同步执行。

附注:如果您正在启动外部流程并希望捕获输出,退出状态等,则可能需要考虑使用POCO's Process之类的内容。