У меня есть некоторые задачи, которые нужно выполнять асинхронно, и сервер не может закрыться, пока еще есть задачи.Поэтому я пытаюсь сохранить в списке фьючерсы, возвращаемые std::async
, но я также не хочу получать их бесконечно растущий список.Поэтому я хочу удалить фьючерсы по мере их завершения.
Вот примерно то, что я пытаюсь сделать:
// this is a member of the server class
std::list<std::future<void>> pending;
std::list<std::future<void>>::iterator iter = ???;
pending.push_back( std::async( std::launch::async, [iter]()
{
doSomething();
pending.remove( iter );
} );
Здесь iter
необходимо указать на недавновставлен элемент, но я не могу получить его до вставки элемента (итератор отсутствует) или после него (поскольку он передается в лямбда-выражение по значению).Я мог бы сделать shared_ptr
для хранения итератора, но это кажется излишним.
Есть ли лучший шаблон для этого?
Обновление: там, кажетсябыть еще одной проблемой с этим.Когда будущее пытается удалить себя из списка, оно, по сути, ждет своего завершения, что блокирует все.Упс!
Кроме того, деструктор списка очищает список до вызова деструкторов элемента.