Управление памятью между потоками - PullRequest
2 голосов
/ 15 ноября 2011

Модуль, над которым я работаю, состоит из пары потоков (аналогично производителю / потребителю), обмен сообщениями между ними осуществляется путем отправки адреса созданного объекта с помощью функции отправки boost :: message_queue.

До настоящего времени управление памятью осуществлялось в явном виде путем создания экземпляра объекта в потоке производителя и удаления его в потоке потребителя после его использования.

Теперь я планирую удалить это явное управление с помощью самоуправляемой памяти (интеллектуальный указатель / boost shared_ptr) по понятным причинам (управление сложностью и предотвращение утечек).

Единственная проблема, с которой я сталкиваюсь, заключается в том, что api boost / message_queue использует в своей подписи необработанный указатель, и я хочу, чтобы память распределялась между потоками. Итак, как мне управлять подсчетом ссылок, чтобы объект сообщения не разрушался сразу же после завершения области действия функции потока производителя, но даже до того, как поток потребителя завершил свою задачу?

Один из способов - сериализовать shared_ptr и использовать его для передачи между потоками. Есть ли более очевидный способ, который я пропускаю? Было бы здорово, если бы я мог найти больше альтернатив здесь. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 15 ноября 2011

boost :: message_queue больше подходит для взаимодействия между process . Если вы просто хотите выполнять передачу сообщений между thread , я бы предпочел использовать простую очередь (с подходящей синхронизацией), в которой хранятся ваши общие_точки.

0 голосов
/ 15 ноября 2011

Библиотека boost :: interprocess особенно подходит для ваших нужд, поскольку она совместима с библиотекой boost :: smart_ptr .Вот сводка:

Boost.Interprocess упрощает использование общих механизмов межпроцессного взаимодействия и синхронизации и предлагает широкий спектр из них:

  1. Общая память.
  2. Отображенные в память файлы.
  3. Семафоры, мьютексы, условные переменные и обновляемые типы мьютексов для размещения их в общей памяти и отображенных в памяти файлах.
  4. Именованные версии этих объектов синхронизации, аналогичныеUNIX / Windows sem_open / CreateSemaphore API.
  5. Блокировка файлов.
  6. Относительные указатели.
  7. Очереди сообщений.

Возможности семафоракажется адекватным, как вы заявили, что

Модуль, над которым я работаю, состоит из пары потоков (аналогично производителю / потребителю), обмен сообщениями между

...