не более k.
Сейчас я создаю k, и потом ожидаю в цикле каждое из них, но нужно, чтобы после того, как один из future доработает, то создать новый и т.д.
Приходит на мысль scoped счётчик, который создаётся внутри future, увеличивает переменную при создании, и уменьшается при выходе. А в точке создания будет активное ожидание на нём, но есть ли что-то получше/попроще?
std::async
Ну я и делаю сейчас 1. for loop(k) futures[i] = std::async(...) 2. for loop(k) futures[i].get() Но проблема в том, что хочу постоянно делать по k задач, а не порциями/
Вызывай функцию внутри future, которая будет создавать новый future
Может тебе тредпул нужен?
Ну тут будет проблема с unhandled exception, так как future может не создастся. Но можно попробовать...
Возможно, но не хочу добавлять ещё сторонние либы в проект - хочу средствами стандарта С++.
Делай очередь задач к каждой future
Средства стандарта C++ в этом месте такие, что лучше не трогать вообще
Нормальные средства стандарта, их хватит
>но не хочу добавлять ещё сторонние либы в проект а в чём причина?
дядь, мы точно про один и тот же С++ говорим?
Я испольузю plog, json, cpr, последняя возвращает std::future для асинхронных запросов, не хочу сюда буст подтягивать для тредпула - кажется, излишним.
Точно. На стандартном c++11 пулы потоков с заданиями вполне можно сделать
У каждого future очередь с задач? Хм, ну можно и так попробовать, но не лучше ли сделать тогда потоки вместо future?
а зачем делать самому, если можно взять готовый?
ну можно не обязательно буст. какие-то там тредпулы есть ещё и в условном POCO (качество либы оставим за кадром). Для тредпулов "на стероидах" можешь посмотреть в SObjectizer
Проблема в том, что очередь может быть пустой для какого-то потока, и он завершит свою работу. А затем из другого потока туда добавяться эллементы. Нужно, чтобы либо потоки были всё время в ожидании, то есть городить целый тредпул, либо создание future динамически после завершения. Последнее я пытаюсь реализовать Даже если очереди будут разные для каждой future, то им нужно будет ожидать на пустых иногда, то есть это нужно делать тредпул.
Проблема тредпула в том, что не понятно, когда задачи завершаться. Очередь может оказаться пустой, но задачи будут на выполнении, а потом снова добавяться эллементы в очередь, и это нужно хендлить. Если я буду ожидать на окончании всех задач в тредпуле, то это превратиться в выполнение порциями, а не парально. Если же буду на одной из, то в конце не смогу захендлить ожидание на всех, так как утерян будет статус работы...
Тредпул удобный, когда есть какой-то сервер, что раниться грубо говоря while(true), но это не мой случай.
Трэдпул стартует и завершает работу вместе приложением
https://github.com/heathkh/taskqueue
Обсуждают сегодня