PPL task_group планирует работу и очищает накопленные ресурсы - PullRequest
0 голосов
/ 31 марта 2012

То, что я хочу в основном выполнить, - это запланировать в группе задач новые рабочие элементы, когда работа станет доступной. В 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 () или подождать () несколько раз).

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

EDIT Документация MSDN гласит, что законно вызывать wait () несколько раз: http://msdn.microsoft.com/en-us/library/dd470481.aspx «Вызов wait для объекта task_group сбрасывает его в чистое состояние, где его можно использовать повторно. Это включает в себя случай, когда объект task_group был отменен.»

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

1 Ответ

0 голосов
/ 01 апреля 2012

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

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

...