我正在处理的模块包含几个线程(类似于生产者/消费者),它们之间的消息传递是通过boost :: message_queue发送函数发送生成的对象的地址来完成的。
到目前为止,内存管理是通过在生产者线程中实例化对象并在使用后在使用者线程中删除它来显式完成的。
现在,我计划使用自我管理的内存(智能指针/ boost shared_ptr)删除此显式管理,原因很明显(控制复杂性并避免泄漏)。
我面临的一个问题是boost :: message_queue发送/接收api在其签名中使用原始指针,我希望内存在线程之间共享。那么我如何管理引用计数,以便在生成器线程函数的范围结束后,甚至在使用者线程完成其任务之前,消息对象不会立即被销毁?
一种方法是将shared_ptr序列化并使用它在线程之间传递。 有没有更明显的方法让我失踪?如果我能在这里获得更多替代品,那就太棒了。提前谢谢。
答案 0 :(得分:4)
boost :: message_queue更适合于进程通信。如果您只想进行线程消息传递,我宁愿使用一个简单的队列(具有适当的同步)来保存您的shared_pointers。
答案 1 :(得分:0)
boost::interprocess library特别适合您的需求compatible with the boost::smart_ptr library。以下是摘要:
Boost.Interprocess简化了常见进程间的使用 通信和同步机制,并提供广泛的范围 他们:
- 共享内存。
- 内存映射文件。
- 信号量,互斥量,条件变量和可升级的互斥锁类型 将它们放在共享内存和内存映射文件中。
- 这些同步对象的命名版本,类似于 UNIX / Windows sem_open / CreateSemaphore API。
- 文件锁定。
- 相对指针。
- 消息队列。
醇>
当您说明
时,信号量功能似乎足够了我正在处理的模块由几个线程(类似于生产者/消费者)组成
之间的消息传递