使用 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;
}
我观察到两种不同类型的崩溃:(大约每五分之一 运行)
- 终止于"This application has requested the Runtime to terminate it in an unusual way."
- 抛出 'std::future_error' 实例后终止,what(): Promise already satisfied.
环境:
- 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++>
的一些人交谈后这个答案仍然是 "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
在我的真实程序中引入 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;
}
我观察到两种不同类型的崩溃:(大约每五分之一 运行)
- 终止于"This application has requested the Runtime to terminate it in an unusual way."
- 抛出 'std::future_error' 实例后终止,what(): Promise already satisfied.
环境:
- 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++>
的一些人交谈后这个答案仍然是 "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