使用 C++11 期货:std::async 的嵌套调用崩溃:Compiler/Standard 库错误?

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

在我的真实程序中引入 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;
}

我观察到两种不同类型的崩溃:(大约每五分之一 运行)

环境:

选项-pthread? 可能是因为某种原因在我的环境中选项 -pthread 没有被默默地考虑在内吗?使用和不使用该选项时,我观察到相同的行为。

由于在与 Lounge<C++> 的一些人交谈后这个答案仍然是 "unanswered,",我想我可以说从评论中可以很明显地看出 这是由于当时 MinGW/MinGW-w64 或 pthread 部分的实现错误。 使用 gcc 4.9.1,MinGW-W64,问题不再出现。事实上,即使在 比 4.8.2 早 的 POSIX 线程

版本上,上面的程序似乎也能正确编译和 运行。

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

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