![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Здравствуйте.
У меня стоит задача организивать очередь для передачи данных между потоками. Передавать необходимо блоки данных определенного размера (определяется на этапе выполнения) С потокобезопасностью разобрался - буду использовать критические секции. Для организации собственно очереди хотел использовать queue<char*>. Насколько я понимаю использование queue, я должен для моей задачи 1) предварительно выделить кусок памяти, записать туда свои данные и затем указатель на эту область памяти передать в queue. 2) Читатель должен сделать queue.back(), получив указатель на эту область, затем сделать queue.pop(); 3) Данные по указателю обрабатываем, копируем куда надо и затем делаем free(); Что мне не нравится в этом: постоянная необходимость выделять и освобождать память. Раньше я использовал очередь, в которой при инициализации указывался максимальное число элементов, и затем лишь копировались данные и изменялись счетчики текущей позиции чтения-записи. От нее пришлось отказаться, по ряду причин и хочется получить замену. Подскажите, каким путем лучше пойти, STL queue мне может помочь? Буду рад совету. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Проблема не в самом выделении памяти (подумаешь), а то, что при твоем дизайне вся ответственность за это дело дежит на клиентском коде или еще того хуже, размазана между клиентским и кодом очереди. Лучше всего хранить в очереди умные указатели на блоки данных. Можно и объект состряпать "блок данных" - пусть сам выделяет память и сам освобождает на деструкторе. -------------------- ... |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
можно выделить заранее некоторое количество таких буферов, и повторно их использовать
можно вместо std::queue использовать неблокирующую очередь, к примеру можно, это организовать используя порты завершения, можно построить такую очередь на основе Interlocked ф-й, как в этой теме: http://forum.vingrad.ru/forum/topic-254786...omic/index.html можно использовать класс tbb::councurrent_queue из библиотеки intel threading building blocks |
|||
|
||||
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Мне бы хотелось в идеале видеть очередь с такими свойствами:
1. queue->init(размер блока, максимальное число блоков, перезаписывать_ли_при_переполнении) 2. queue->push(указатель на данные); // метод копирует данные в очередь. 3. queue->pop(указатель на приемный буффер); // метод копирует данные из первого элемента, удаляет первый элемент из очереди. По поводу выделения памяти... надо бы конечно тест произвести, насколько это влияет, однако очередь будет использоваться в различных ситуациях, в том числе с большой нагрузкой (промышленная автоматизация). Не хотелось бы создавать тысячи объектов в секунду там, где можно выполнить memcpy:) Спасибо за ссылки, буду смотреть. Пока что прихожу к выводу, что проще самому написать необходимое. Это сообщение отредактировал(а) Alexander06 - 6.7.2009, 16:48 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |