Я учусь использовать задачи в C ++.
Здесь я не понимаю, почему продолжение моего задания никогда не выполняется:
#include <iostream>
#include <ppltasks.h>
using namespace concurrency;
const concurrency::task<void> f1()
{
std::cout << "Inside f1() \n";
concurrency::task<void> rv;
return rv;
}
const concurrency::task<void> f2()
{
std::cout << "Inside f2() \n";
concurrency::task<void> rv;
return rv;
}
const concurrency::task<void> f3()
{
std::cout << "Inside f3() \n";
concurrency::task<void> rv;
return rv;
}
int main()
{
std::cout << "The BEGIN !\n";
auto myTask = create_task(f1).then([&]() { std::cout << "Affter f1() \n"; });
auto mytask2 = create_task(f2) && create_task(f3).then([=]() { std::cout << "Affter f3() \n"; });
myTask.then([&]() { std::cout << "Affter f1() \n"; });
for (int i = 0; i < 10; i++)
{
std::cout << "The END !\n\n";
}
}
Вот что выдает программа:
The BEGIN !
Inside f1()
Inside f3()
Inside f2()
The END !
The END !
The END !
The END !
The END !
The END !
The END !
The END !
The END !
The END !
Редактировать:
Чтобы лучше понять задачи, я изменил программу следующим образом:
#include "pch.h"
#include <iostream>
#include <ppltasks.h>
using namespace concurrency;
task<void> f1()
{
return create_task([] {std::cout << "Inside f1() \n"; }).then([] {std::cout << "Continuation of f1() \n"; });
}
task<void> f2()
{
return create_task([] {std::cout << "Inside f2() \n"; }).then([] {std::cout << "Continuation of f2() \n"; });
}
task<void> f3()
{
return create_task([] {std::cout << "Inside f3() \n"; }).then([] {std::cout << "Continuation of f3() \n"; });
}
int main()
{
std::cout << "The BEGIN !\n";
auto myTask1 = f1();
auto myTask2 = f2();
auto myTask3 = f3();
// use get() to wait for all 3 tasks and their continuations to be done
(myTask1 && myTask2 && myTask3).get();
std::cout << "The END !\n";
}
, которая теперь, кажется, работает, и дает такой результат:
The BEGIN !
Inside f1()
Inside f2()
Inside f3()
Continuation of f2()
Continuation of f3()
Continuation of f1()
The END !
Так что, если я хорошо понимаю это сейчас, я не могу отдельно добавить продолжение к задаче, как я пытался сделать в своей первой версии кода?
EDIT2:
Хорошо, я был неправ, мы можем очень хорошо добавить продолжение отдельно, как это:
int main()
{
std::cout << "The BEGIN !\n";
auto myTask1 = f1();
auto myTask2 = f2();
auto myTask3 = f3();
auto completeTask = (myTask1 && myTask2 && myTask3).then([] {std::cout << "All tasks done !!! \n"; });
// use get() to wait for all 3 tasks and their continuations to be done
completeTask.get();
std::cout << "The END !\n";
}
, который даст такой результат:
The BEGIN !
Inside f1()
Inside f2()
Inside f3()
Continuation of f1()
Continuation of f3()
Continuation of f2()
All tasks done !!!
The END !
Теперь у меня наконец есть именно то, что яхотел, спасибо всем.