| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > организация очереди ограниченного объема |
| Автор: Alexander06 3.7.2009, 19:14 |
| Здравствуйте. У меня стоит задача организивать очередь для передачи данных между потоками. Передавать необходимо блоки данных определенного размера (определяется на этапе выполнения) С потокобезопасностью разобрался - буду использовать критические секции. Для организации собственно очереди хотел использовать queue<char*>. Насколько я понимаю использование queue, я должен для моей задачи 1) предварительно выделить кусок памяти, записать туда свои данные и затем указатель на эту область памяти передать в queue. 2) Читатель должен сделать queue.back(), получив указатель на эту область, затем сделать queue.pop(); 3) Данные по указателю обрабатываем, копируем куда надо и затем делаем free(); Что мне не нравится в этом: постоянная необходимость выделять и освобождать память. Раньше я использовал очередь, в которой при инициализации указывался максимальное число элементов, и затем лишь копировались данные и изменялись счетчики текущей позиции чтения-записи. От нее пришлось отказаться, по ряду причин и хочется получить замену. Подскажите, каким путем лучше пойти, STL queue мне может помочь? Буду рад совету. |
| Автор: Lazin 3.7.2009, 20:26 |
| можно выделить заранее некоторое количество таких буферов, и повторно их использовать можно вместо std::queue использовать неблокирующую очередь, к примеру можно, это организовать используя порты завершения, можно построить такую очередь на основе Interlocked ф-й, как в этой теме: http://forum.vingrad.ru/forum/topic-254786/hl/interlocked+atomic/index.html можно использовать класс tbb::councurrent_queue из библиотеки intel threading building blocks |
| Автор: Alexander06 3.7.2009, 20:41 |
| Мне бы хотелось в идеале видеть очередь с такими свойствами: 1. queue->init(размер блока, максимальное число блоков, перезаписывать_ли_при_переполнении) 2. queue->push(указатель на данные); // метод копирует данные в очередь. 3. queue->pop(указатель на приемный буффер); // метод копирует данные из первого элемента, удаляет первый элемент из очереди. По поводу выделения памяти... надо бы конечно тест произвести, насколько это влияет, однако очередь будет использоваться в различных ситуациях, в том числе с большой нагрузкой (промышленная автоматизация). Не хотелось бы создавать тысячи объектов в секунду там, где можно выполнить memcpy:) Спасибо за ссылки, буду смотреть. Пока что прихожу к выводу, что проще самому написать необходимое. |