| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > boost и очередь заданий |
| Автор: mrgloom 11.11.2011, 12:23 |
| есть задача: на диске лежит много картинок, сразу все загрузить в память нельзя, есть ограничние по памяти скажем 2Гб. необходимо грузить по 2 штуки, проделывать некий обсчет, затем записывать результат в структуру (собсвенно это один таск и таких тасков должно быть N в зависимости от свободных ресурсов процессора или памяти). надо загрузить все ядра по максимуму. я так понимаю нужно сделать очередь тасков, скажем пары имен файлов которые надо загружать для обработки, потом создать сколько то тредов, и чтобы они брали оттуда таски с синхронизацией доступа и выполняли по мере своего освобождения. как это сделать с помощью буста? |
| Автор: boostcoder 11.11.2011, 13:11 |
boost::asio::io_service+boost::thread_group |
| Автор: mrgloom 11.11.2011, 15:30 |
| не очень понятно с чем есть boost::asio и как он мне поможет. вообщем я в самом бусте не очень хорошо пока ориентируюсь. что если сделать так. создать массив всех изображений с путями к ним. загрузить N изображений, где N четное больше 2 и суммма изображений занимает меньше отведенной под это памяти. составить пары изображений из загруженных изображений и создать кол-во тредов равное кол-ву пар (правильно ли это?) (треды можно как раз создать через thread group), либо какое то фиксированное кол-во тредов, либо через hardware concurency определить кол-во тредов и соответственно кол-во пар изображений перед загрузкой. можно ли обращаться к одним и тем же изображениям одновременно на чтение? или вообще неплохо было бы чтобы 1 тред загружал изображения для следущей итерации, пока другие треды работают с уже загруженными парами. |
| Автор: boostcoder 11.11.2011, 18:44 |
создаешь нужное кол-во потоков. создаешь объект типа http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/io_service.html. даешь ему http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/io_service__work.html чтоб не завершались потоки если вдруг задачи в очереди закончатся или до тех пор пока ты еще не добавил задачи. в каждом из потоков создаешь объект http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/io_service__strand.html чтоб гарантировать что задачи каждого конкретного потока будут выполняться последовательно(ведь io_service один, а потоков несколько). в каждом из потоков добавляешь в очередь задачи при помощи http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/io_service/post.html. |
| Автор: bsa 11.11.2011, 20:22 |
К сожалению, ASIO имеет название, не совсем соответствующее библиотеке. И если не знать, что кроме асинхронного ввода/вывода она позволяет еще и очередью задач манипулировать, то можно эту ее классную особенность упустить из виду. |