我希望并行运行一些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()
,因为在我的真实代码中,我正在使用不同字符串中的参数。
答案 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
之类的内容。