使用C ++ 11期货:std ::asynchronous崩溃的嵌套调用:编译器/标准库的错误?
在我的真实程序中引入std :: async的嵌套调用时遇到崩溃后,我能够在以下最小的示例中重现该问题。 它经常崩溃,但并不总是。 你看到什么东西出了问题,还是它是一个编译器或标准库的错误? 请注意,如果添加对期货的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; }
我观察到两种不同的崩溃:(大约每五分钟一次)
- 终止与“这个应用程序已经要求运行时间以一种不寻常的方式终止”。
- 抛出“std :: future_error”的实例后,什么():Promise已经满足了 。
环境:
- Windows 7的
- gcc版本4.8.2(i686-posix-dwarf-rev3,由MinGW-W64项目构build),由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线程,上面的程序似乎也能正确编译和运行。
我自己不是一个专家,我的猜测是,当程序似乎试图写两次相同的承诺,我认为应该是一个很大的禁忌,作为一个std :: async应该只写一次结果(再次,我不知道我是否在这里,其他意见和编辑将很可能澄清)。
另外,这可能是一个相关的问题: std ::未来的gcc实验实现C ++ 0x的exception