在我的真实程序中引入std :: async的嵌套调用后遇到崩溃后,我能够在以下最小示例中重现该问题。它经常崩溃,但并非总是如此。你看到出了什么问题,还是编译器或标准库bug?请注意,如果添加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;
}
我观察到两种不同类型的崩溃:(大约每五次运行)
环境:
g++ -std=c++11 -pthread futures.cpp
选项-pthread
?
可能是因为某种原因我的环境中的选项-pthread
没有被考虑在内吗?无论有没有选择,我都会观察到相同的行为。
答案 0 :(得分:2)
由于在与Lounge<C++>
的某些人交谈之后,这个答案仍然“没有答案”,我想我可以说从评论中可以看出这很明显这是由于MinGW上的实施错误/ MinGW-w64或pthread当时的部分。使用gcc 4.9.1,MinGW-W64,问题不再出现了。实际上,即使在早于的版本而不是带有POSIX线程的4.8.2上,上述程序似乎也能正确编译和运行。
我自己不是专家,我的猜测是当程序似乎尝试两次写同一个承诺时会发生确切的绊倒,我认为这应该是一个很大的禁忌,作为标准:: async应该只写一次结果(同样,我不确定我是否就在这里,其他评论和编辑很可能会澄清)。
此外,这可能是一个相关问题:std::future exception on gcc experimental implementation of C++0x