【发布时间】:2019-03-15 02:53:15
【问题描述】:
此示例在 windows7 和 ideone.com 上打印所有 2 条消息,但无法在 windows xp 上打印第二条消息。我做错了什么?如果是错误,我应该在哪里报告?
使用 Visual Studio 2017 为 windows xp 编译,平台工具集 v141_xp。
#include <iostream>
#include <future>
#include <thread>
using namespace std;
int main()
{
auto f1 = async(launch::async, []()->int {
cout << "in outer async" << endl;
auto f2 = async(launch::async, []()->int {
cout << "in inner async" << endl;
return 2;
});
f2.get();
return 1;
});
f1.get();
return 0;
}
使用 std::thread 而不是 std::async 进行内部函数时的 UPD - 它在两个系统上都运行良好
auto f2 = thread([]()->int {
cout << "in inner async" << endl;
return 2;
});
f2.join();
UPD2
visual studio 2017 cl.exe 版本 19.14.26428 工具集 v141_xp
命令行:
/permissive- /Yu"stdafx.h" /GS /GL /analyze- /Wall /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"Release\vc141.pdb" /Zc:inline /fp:precise /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_USING_V110_SDK71_" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /std:c++17 /FC /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\testasync.pch" /diagnostics:classic
在 windows xp 上使用时,UPD3 看起来像 launch::async 被忽略
vector<future<void>> v;
for( int i = 0; i < 10; i++ )
v.push_back(async(launch::async, []() {cout << "thread" << endl; this_thread::sleep_for(5s); }));
for( auto &f : v )
f.get();
在 windows7 上这需要大约 6 秒才能完成,在 windows xp 上大约需要 50 秒
【问题讨论】:
-
编译器版本?编译器命令?
-
那么会发生什么?行
cout << "in inner async" << endl;是否已执行但在输出中不可见还是什么? -
stackoverflow.com/q/6374264/4955498 但这并不能解释缺少文本,只能解释混合文本。此外,第二个 cout 仅在第一个 cout 完成后发生,因此在这种情况下不适用混合
-
@Fl0 你应该发布正确的问题描述。 “无法打印第二条消息”和“程序只是挂起”是完全不同的。它挂在哪一行?最好也包含用于运行线程的调用堆栈。
-
在 windows XP 上你的程序完成了吗?在 Windows 中,
std::async(...)位于线程池之上。所以可能会出现死锁。在f1中运行新任务并调用f2.get(),它会阻塞直到f2完成。但是如果auto f2 = async(...)选择了运行f1的同一个线程,那么你就会出现死锁并且你的程序不应该完成。如果是这样,那么情况并非如此。
标签: c++ visual-c++ windows-xp