在我的实际程序中引入 std::async 嵌套调用时遇到崩溃后,我能够在以下 最小示例 中重现该问题。它经常崩溃,但并非总是如此。你看到什么地方出了问题,还是编译器或标准库错误?请注意,如果添加了对 future 的 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 版本 4.8.2(i686-posix-dwarf-rev3,由
    MinGW-W64 项目),由 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 线程的版本上,上面的程序似乎也能正确编译和运行。

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

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

    关于c++ - 使用 C++11 future :std::async 崩溃的嵌套调用:编译器/标准库错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28604461/

    10-14 17:35
    查看更多