将std :: async与std :: launch :: async结合使用时的奇怪行为

时间:2018-09-06 20:39:54

标签: c++ stdasync std-future

我正在努力将C ++ 11中引入的DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { } ViewDidAppear包围起来。

std::async

我得到的上述程序的输出如下所示。

std::futures

我的问题是,由于我使用#include <iostream> #include <list> #include <functional> #include <vector> #include <algorithm> #include <thread> #include <unistd.h> #include <string> #include <future> using namespace std; int hog_cpu() { cout << "hog_cpu" << endl; volatile unsigned long long i = 0; for(i = 0; i < 1000000000ULL ; i++); return 50; } int hog_cpu_ex() { cout << "hog_cpu_ex" << endl; volatile unsigned long long i = 0; for(i = 0; i < 1000000000ULL ; i++); return 500; } int main() { cout << "start threads asynchronously" << endl; std::future<int> f1 = std::async(std::launch::async, hog_cpu); std::future<int> f2 = std::async(std::launch::async, hog_cpu_ex); cout << "Get the Results" << endl; int r1 = f1.get(); int r2 = f2.get(); cout << "result 1: " << r1 << endl; cout << "result 2: " << r2 << endl; return 0; } ,因此应立即使用另一个线程开始执行。其中,输出告诉我它打印行start threads asynchronously Get the Results hog_cpu_ex hog_cpu result 1: 50 result 2: 500 Process finished with exit code 0 ,然后仅开始执行。 (从上面的日志中可以明显看出)。同样std::launch::asyncGet the results之前开始。有人可以解释为什么会这样。

1 个答案:

答案 0 :(得分:1)

这样做的时候

std::future<int> f1 = std::async(std::launch::async, hog_cpu);

std::future<int> f2 = std::async(std::launch::async, hog_cpu_ex);

您又增加了两个执行线程。然后主线程在调用每一行之后一直继续运行,直到命中为止不会停止

int r1 = f1.get();

如果f1尚未完成。由于主线程一直在运行,并且旋转线程需要花费一些时间,因此在线程甚至开始启动之前先查看Get the Results的打印是很合理的。

关于您为什么看到

hog_cpu_ex
hog_cpu

而不是相反是由于您的操作系统。它可以控制运行哪些线程以及何时运行,因此很有可能使f1进入睡眠状态,为f2提供了空间,因此它开始运行,然后在之后的某个时间启动f1