Странное поведение при использовании std :: async с std :: launch :: async

Я пытаюсь обернуть голову 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, Может кто-нибудь объяснить, почему это может происходить.

0

Решение

Когда вы делаете

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 когда-нибудь после этого.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]