在我的实际程序中引入 std::async 嵌套调用时遇到崩溃后,我能够在以下 最小示例 中重现该问题。它经常崩溃,但并非总是如此。你看到什么地方出了问题,还是编译器或标准库错误?请注意,如果添加了对 future 的 get()
调用,问题仍然存在。
#include <future>
#include <vector>
int main (int, char *[])
{
std::vector<std::future<void>> v;
v.reserve(100);
for (int i = 0; i != 100; ++i)
{
v.emplace_back(std::async(std::launch::async, [] () {
std::async(std::launch::async, [] { });
}));
}
return 0;
}
我观察到两种不同的崩溃:(大约每五次运行一次)
环境:
MinGW-W64 项目),由 Qt 5.3.2
g++ -std=c++11 -pthread futures.cpp
选项
-pthread
? 难道在我的环境中出于某种原因,选项
-pthread
没有被默默考虑在内?使用和不使用该选项时,我观察到相同的行为。 最佳答案
由于这个答案仍然“未答复”,在与 Lounge<C++>
的一些人交谈后,我想我可以说,从评论中很明显 这是由于 MinGW/MinGW-w64 或 pthread 部分的实现错误时间。 使用gcc 4.9.1,MinGW-W64,问题不再出现。事实上,即使在 4.8.2 之前的带有 POSIX 线程的版本上,上面的程序似乎也能正确编译和运行。
我自己不是专家,我的猜测是,当程序似乎尝试两次写入相同的 promise 时,确切的绊倒发生了,我认为,作为 std::async,这应该是一个很大的禁忌应该只写一次结果(同样,我不确定我是否在这里,其他评论和编辑很可能会澄清)。
另外,这可能是一个相关的问题:std::future exception on gcc experimental implementation of C++0x
关于c++ - 使用 C++11 future :std::async 崩溃的嵌套调用:编译器/标准库错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28604461/