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

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

本文关键字:编译器 调用 标准 嵌套 错误 期货 C++11 std async 崩溃 使用      更新时间:2023-10-16

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

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

  • Termination with"此应用程序已请求运行时以异常方式终止它。"
  • 抛出'st::future_error'的实例后终止,what():Promise has been compensated

环境:

  • Windows 7
  • gcc版本4.8.2(i686-posix-侏儒-rev3,由MinGW-W64项目),如问题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线程上也是如此。

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

此外,这可能是一个相关的问题:C++0x 的gcc实验实现的std::future异常