блок видимости при использовании std :: async в функции, отличной от основной функции - PullRequest
0 голосов
/ 08 января 2019

У меня есть некоторые проблемы с st :: async, когда это используется в другой функции, кроме функции Main, предположим, у меня есть такие функции, как текущий:

void printData() 
{
   for (size_t i = 0; i < 5; i++)
    {
        std::cout << "Test Function" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

void runningAsync()
{
    auto r = std::async(std::launch::async, test);
}

int main()
{
    runningAsync();

    std::cout << "Main Function" << std::endl;
}

вывод этого кода:

Test Function
Test Function
Test Function
Test Function
Test Function
Main Function

это нехорошо, основной поток ожидает завершения другого потока.

Я хочу, чтобы функция runningAsync () запускалась в другом потоке, и в то же время «Основная функция» в основном потоке печаталась на экране, это возможно с помощью std :: thread.

таким образом, чтобы этот запуск выполнялся одновременно (параллелизм)?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

На этот вопрос ответили:

основной поток ожидает завершения std :: async

Можно ли использовать std :: async, не ожидая будущих ограничений?

Кто бы ни, если вы сохраните объект std :: future, его время жизни будет продлено до конца main, и вы получите желаемое поведение.

void printData() 
{
   for (size_t i = 0; i < 5; i++)
    {
        std::cout << "Test Function" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

std::future<void> runningAsync()
{
    return std::async(std::launch::async, test);
}

int main()
{
    auto a = runningAsync();

    std::cout << "Main Function" << std::endl;
}

Это проблема, потому что деструктор std :: future может блокировать и ждать завершения потока. см. эту ссылку для более подробной информации

0 голосов
/ 08 января 2019

Причина в том, что std::async возвращает std::future, который вы храните в переменной auto. Как только ваше будущее выходит за рамки (в конце runningAsync()!), Его деструктор блокируется, пока задача не будет завершена. Если вы не хотите этого, вы можете, например, сохранить будущее в глобальном контейнере.

...