c++ 11在Mac和Linux上异步行为的差异
Difference in C++11 async behaviour on Mac and Linux
考虑以下c++代码:
#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秒的延迟?异步任务不是应该在后台运行吗?我是否使用了错误的编译选项?
async
作为可选参数,如果您想在不同的线程中启动它,或者只是等待直到调用.wait
来运行代码。
你省略了"I do not care"。
如果你关心,说明你想在不同的线程中。如果没有,如果它们一直等到您设置了.wait
才运行它,或者启动一个新线程并在那里运行它,您不应该感到惊讶。在您的情况下,一个编译器使它变得懒惰,另一个将它放在自己的线程中。
要获得您期望的行为,将std::launch::async
作为第一个参数传递给std::async
。
现在,理论上async
没有被告知如何运行,它应该做一些聪明的事情。但是有些编译器会说"总是偷懒对我们来说工作更少"(或者总是异步的),所以当你允许它的时候总是偷懒的。
这是一个实现质量问题。在这一点上,您不能相信async
在您正在使用的所有c++ 11编译器上都是智能的。十年后再来。
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- 有人安装"IITB Simplecpp in mac"吗?
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 在 Mac 上的 python 上提升
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- 如何在 Mac 上正确编译C++,当它在 Linux 上编译没有问题时?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何在 MAC OS c/c++ 中阻止 USB 存储设备
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 如何在C++中实现带有packaged_task的异步等待循环?
- 创建 Spdlog 异步文件记录器时遇到困难
- C ++异步键盘输入(标准方式)
- 在装有 CLion 的 Mac 上使用 C++ 连接到 MySQL 数据库时出现问题
- c++ 11在Mac和Linux上异步行为的差异