使用C 11 futures:std :: async崩溃的嵌套调用:编译器/标准库错误?

在我的实际程序中引入std :: async的嵌套调用时遇到崩溃后,我能够在以下最小示例中重现该问题。它经常崩溃,但不总是。你看到什么问题,或者是一个编译器或标准库错误?注意,如果对futures的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’的实例后终止,what():Promise已经满足。

环境:

> Windows 7
> gcc version 4.8.2(i686-posix-dwarf-rev3,由
MinGW-W64项目),由Qt 5.3.2提供
>命令行调用:g -std = c 11 -pthread futures.cpp
>编译并在两台独立的机器上运行

选项-pthread?
难道是在我的环境中由于某种原因选项-pthread是默默地不考虑?我观察到相同的行为有和没有该选项。

最佳答案
因为这个答案仍然是“未回答”,在与一些聊天室< C>之后,我想我可以说,这是很明显的,从评论,这是由于在MinGW / MinGW-W64或pthread的实现错误部分的时间。使用gcc 4.9.1,MinGW-W64,问题不再出现。事实上,上面的程序似乎编译和运行正确,即使在早于4.8.2与POSIX线程的版本。

我自己不是一个专家,我的猜测是,当程序似乎试图写两次相同的诺言,我认为应该是一个很大的no-no,确切的跳闸发生,作为一个std :: async应该只写一次结果(再次,我不知道如果我在这里,其他意见和编辑很可能澄清)。

此外,这可能是一个相关的问题:std::future exception on gcc experimental implementation of C++0x

转载注明原文:使用C 11 futures:std :: async崩溃的嵌套调用:编译器/标准库错误? - 代码日志