Как сообщить С++ concurrency время выполнения для повторного использования предыдущего потока для продолжения задачи

86
6

Я использовал визуальную среду С++ concurrency для создания задачи, а затем запланировал четыре ее продолжения


#include <iostream>
#include <thread>
#include <ppltasks.h>

int main()
{
concurrency::create_task([]
{
std::cout << std::this_thread::get_id() << std::endl;
})
.then([]
{
std::cout << std::this_thread::get_id() << std::endl;
})
.then([]
{
std::cout << std::this_thread::get_id() << std::endl;
})
.then([]
{
std::cout << std::this_thread::get_id() << std::endl;
})
.then([]
{
std::cout << std::this_thread::get_id() << std::endl;
});

std::cin.get();
}


Отпечатает следующий вывод


29432
29432
25096
25668
42488

Обратите внимание, что 4 продолжения не запланированы в том же потоке, что и исходная задача. Есть ли способ запланировать продолжение в том же потоке, что и исходная задача? Я считаю, что это возможно в С# с помощью TaskContinuationOptions.ExecuteSynchronously.

спросил(а) 2021-01-19T14:35:02+03:00 2 месяца, 3 недели назад
1
Решение
62

Обычно вы можете управлять контекстом, в котором продолжения выполняются с помощью task_continuation_context, а описывает документацию MSDN. Однако в той же документации также упоминается, что:


Полезно использовать этот класс только из приложения Windows Store. Для приложений, отличных от Windows Store, контекст выполнения продолжения задачи определяется средой выполнения и не настраивается.


Кажется, из вашего фрагмента кода, что при использовании среды выполнения Concurrency вы не используете его из приложения Windows Store. Поэтому контекст будет всегда всегда произвольным.


Также возникает вопрос, почему вы хотите явно запускать последующие задачи в том же потоке, что и первая задача: почему бы просто не поставить код этих задач внутри первой задачи? Точка продолжения должна возвратиться к конкретному потоку, чтобы продолжить работу, выполненную в фоновом задании, то есть первая задача обязательно будет фоновой работой, которую вы хотите сделать, и продолжения реагируют на эту работу из основной, инициирующий поток. Если вы хотите остаться в фоновом потоке, тогда оставайтесь там и не утруждайте себя продолжением этой работы. (Однако, как уже упоминалось выше, поскольку это не приложение для Windows Store, все эти продолжения и задачи выполняются в произвольном контексте, а время выполнения просто выбирает удобный поток.) ​​

ответил(а) 2021-01-19T14:35:02+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема