Почему продолжение моего задания никогда не выполняется? - PullRequest
0 голосов
/ 17 мая 2019

Я учусь использовать задачи в 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 !

Теперь у меня наконец есть именно то, что яхотел, спасибо всем.

...