PPL task_group расписание работы и очистка накопленных ресурсов

То, что я хочу в основном выполнить, - это запланировать новые рабочие элементы task_group по мере того, как работа станет доступной. В task_group метод run () вызывается в сценарии производителя-потребителя - так что в любой момент, когда необходима работа, он запланирован для запуска в task_group

Concurrency::task_group taskGroup;

tempalte <typename Functor>
void queue_work(Functor& fn)
{
    taskGroup.run([&fn](){
        fn();
    });
}

task_group требует (перед выходом из приложения), чтобы был вызван метод wait () для освобождения ресурсов. Я использую task_group, потому что мне также нужна поддержка отмены, но необходимость вызова wait () усложняет дизайн. На практике кажется, что мне нужно будет использовать дополнительный поток, из которого время от времени будет вызывать wait () в группе задач (не знаю, законно ли планировать новую работу в task_group после однократного вызова wait () или делать wait () несколько раз).

Как бы вы это сделали, используя PPL от Microsoft?

ИЗМЕНИТЬ В документации MSDN указано, что вызов wait () разрешен несколько раз: http://msdn.microsoft.com/en-us/library/dd470481.aspx" Вызов wait для объекта task_group сбрасывает его в чистое состояние, где его можно использовать повторно. Это включает случай, когда объект task_group был отменен. "

Единственное, что осталось бы, если бы можно было выбрать другой подход


person Ghita    schedule 31.03.2012    source источник


Ответы (1)


В конце концов, моим решением было использование специальной задачи, созданной CurrentScheduler :: ScheduleTask (), из которой я время от времени вызываю task_group.wait (), чтобы очистить накопленные ресурсы планировщика параллелизма.

Когда приложение хочет выйти, я должен сообщить этой задаче, что она должна завершиться сама (для хорошей очистки)

person Ghita    schedule 01.04.2012