关于c ++:使用C ++ 11期货:std :: async崩溃的嵌套调用:编译器/标准库错误?

Using C++11 futures: Nested calls of std::async crash: Compiler/Standard library bug?

在我的实际程序中引入std::async的嵌套调用时遇到崩溃之后,我能够在下面的最小示例中重现这个问题。它经常崩溃,但不总是。你看到什么地方出错了吗,或者它是一个编译器或标准库错误?请注意,如果增加对期货的get()调用,问题仍然存在。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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;
}

我观察到两种不同类型的车祸:(大约每五次)

    百万千克1以"此应用程序已请求运行时以异常方式终止它"终止。百万千克1百万千克1抛出"std::future_error"实例后终止,what():promise已经满足。百万千克1

环境:

    百万千克1Windows 7百万千克1百万千克1GCC版本4.8.2(i686-posix-dwarf-rev3,由Mingw-W64项目),如Qt 5.3.2所述百万千克1百万千克1命令行调用:g++ -std=c++11 -pthread futures.cpp。百万千克1百万千克1编译并在两台独立的机器上运行百万千克1

选项1〔2〕?可能是因为某种原因,在我的环境中,选项-pthread没有被静默地考虑在内吗?我观察到同样的行为,不管有没有这个选择。


由于这个答案在与一些来自Lounge的人交谈之后仍然是"没有答案的",我认为从评论中可以很明显地看出,这是由于mingw/mingw-w64或pthread当时的一个实现错误造成的。使用GCC4.9.1,mingw-w64,问题不再出现。事实上,即使在4.8.2之前的版本中使用POSIX线程,上述程序似乎也能正确编译和运行。

我本人不是专家,我的猜测是,当程序出现两次试图写同一个承诺时,就会发生确切的错误,我认为这应该是一个很大的错误,因为std::async应该只写一次结果(同样,我不确定我是否在这里,其他评论和编辑很可能会澄清)。

此外,这可能是一个相关问题:STD::GCC实验实现的C++0x的未来异常