使用C++11期货:std::async崩溃的嵌套调用:编译器/标准库错误
Using C++11 futures: Nested calls of std::async crash: Compiler/Standard library bug?
在我的真实程序中引入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异常
相关文章:
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 重载方法的方式会在使用临时调用时生成编译器错误
- C++ DLL 类导出、编译器"optimizes"虚拟调用
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 编译器调用复制运算符而不是移动运算符
- 为什么编译器将其解析为函数指针而不是递归调用?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 在构建过程中捕获所有编译器调用和命令行参数
- 更改CMAKE中的编译器调用
- 你如何告诉 Clang 编译器调用使用框架
- 为什么编译器调用 -> 运算符两次
- 不同的强制转换操作符被不同的编译器调用
- 为什么编译器调用默认构造函数
- c++编译器调用错误
- 编译器调用基类方法而不是子类方法
- 显示对as, ar, ld等工具的编译器调用或确定等效调用
- g++ 编译器调用函数时出错(向量<向量<int> > &)
- 使用c++ /intel c++编译器调用fortran函数
- 为什么编译器调用第一个重载函数而不是第二个