Я пытаюсь обернуть голову std::async
а также std::futures
введено в C ++ 11.
#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
и тогда только выполнение начинается. (Как видно из журналов выше). Также hog_cpu_ex
начинается раньше hog_cpu
, Может кто-нибудь объяснить, почему это может происходить.
Когда вы делаете
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
когда-нибудь после этого.
Других решений пока нет …