【发布时间】:2017-03-03 22:08:45
【问题描述】:
考虑以下 C+11 代码:
#include <chrono>
#include <future>
#include <iostream>
#include <thread>
using namespace std;
int main() {
auto start = chrono::steady_clock::now();
auto elapsed = [start](string s) {
cout << s << (chrono::steady_clock::now() - start).count() << endl;
};
elapsed("A ");
auto fut (async([]() { this_thread::sleep_for(chrono::seconds(2)); }));
elapsed("B ");
this_thread::sleep_for(chrono::seconds(1));
elapsed("C ");
fut.wait();
elapsed("D ");
return 0;
}
Mac 结果
在 macOS Sierra 上使用命令 c++ -std=c++11 -stdlib=libc++ -Wall question.cc -o question 编译上述代码并运行,我得到输出:
A 27186
B 86970
C 1001961755
D 2001585903
这是预期的。到达 A 和 B 花费了最少的时间,等待 1 秒然后到达 C,并等待剩余的 2 秒(1 秒已经过去)到达 D。
Mac 编译器是:
$ c++ --version
Apple LLVM version 8.0.0 (clang-800.0.38)
Target: x86_64-apple-darwin16.0.0
Thread model: posix
Linux 结果
在Linux上,我用c++ -std=c++11 -pthread question.cc -o question编译了同样的代码并运行,得到了结果:
A 32423
B 444340
C 1003635793
D 3006121895
Linux 编译器是:
$ c++ --version
c++ (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
我还在 Linux 上尝试了clang++,LLVM C++ 编译器。结果相同。
问
为什么在 Linux 上 C 和 D 之间有整整 2 秒的延迟?异步任务不应该在后台运行吗?我是否使用了错误的编译选项?
【问题讨论】:
-
无法在 Linux 上使用 gcc 6.2 重现。 C 到 D 需要一秒钟。
-
@SamVarshavchik 编译器的区别?
-
我可以在 Linux 4.4.0-42 上使用 g++
5.4.0-6ubuntu1~16.04.2进行复制。介意在 Linux 上发布strace question的输出吗? -
将
std::launch::async明确设置为所需的策略也会在 Linux 上产生预期的行为。
标签: c++ linux macos c++11 asynchronous