rit*_*mon 6 c++ linux macos asynchronous c++11
考虑以下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;
}
Run Code Online (Sandbox Code Playgroud)
使用命令c++ -std=c++11 -stdlib=libc++ -Wall question.cc -o question和运行在macOS Sierra上编译所述代码,我得到输出:
A 27186
B 86970
C 1001961755
D 2001585903
Run Code Online (Sandbox Code Playgroud)
这是预料之中的.花最少的时间去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
Run Code Online (Sandbox Code Playgroud)
在Linux上,我用c++ -std=c++11 -pthread question.cc -o question和编译了相同的代码,得到了结果:
A 32423
B 444340
C 1003635793
D 3006121895
Run Code Online (Sandbox Code Playgroud)
Linux编译器是:
$ c++ --version
c++ (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
我也试过clang++Linux,即LLVM C++编译器.结果相同.
为什么Linux 之间C和之间存在完全2秒的延迟D?是不是异步任务应该在后台运行?我使用错误的编译选项吗?
async如果要在不同的线程中启动它,或者只是等到.wait调用它来运行代码,则将其作为可选参数.
你省略了它,选择了"我不在乎".
如果你关心,请说明你想要它在另一个线程中.如果没有,你不应该感到惊讶,如果他们等到你.wait编辑运行它,或者开始一个新线程并在那里运行它.在你的情况下,一个编译器使它变得懒惰,另一个编译器将它放在它自己的线程中.两者都是标准允许的.
要获得您期望的行为,std::launch::async请将第一个参数传递给std::async.
现在,理论上async没有被告知如何运行它应该做一些聪明的事情.但是有些编译器喋喋不休并且说"总是做懒惰对我们来说不那么有用"(或者总是异步),所以每当你放弃它时总是很懒.
这是一个实施质量问题.在这一点上,你不能相信async你正在使用的所有C++ 11编译器都很聪明.十年后回来.
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |