многопоточность — как указать среде выполнения параллелизма c ++ повторно использовать предыдущий поток для продолжения задач

Я использовал среду выполнения Visual C ++ для создания задачи, а затем запланировал на ней четыре продолжения.

#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 продолжения не запланированы в том же потоке, что и исходная задача. Есть ли способ запланировать продолжения в том же потоке, что и исходная задача? Я считаю, что это возможно в C # с помощью TaskContinuationOptions.ExecuteSynchronously вариант.

3

Решение

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

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

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

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

0

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