我正在努力将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::async
在Get the results
之前开始。有人可以解释为什么会这样。
答案 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