【问题标题】:Memory management across threads跨线程内存管理
【发布时间】:2011-11-15 07:33:56
【问题描述】:

我正在开发的模块由几个线程组成(类似于生产者/消费者),它们之间的消息传递是通过 boost::message_queue 发送函数发送生产对象的地址来完成的。

到目前为止,内存管理是通过在生产者线程中实例化对象并在使用后在消费者线程中将其删除来显式完成的。

现在,出于显而易见的原因(控制复杂性和避免泄漏),我计划使用自我管理的内存(智能指针/boost shared_ptr)删除这种显式管理。

我面临的一个问题是 boost::message_queue 发送/接收 api 在其签名中使用原始指针,我希望跨线程共享内存。那么如何管理引用计数,以便消息对象不会在生产者线程函数的范围结束后立即销毁,甚至在消费者线程完成其任务之前?

一种方法是让 shared_ptr 序列化并使用它在线程之间传递。 有没有更明显的方式我错过了?如果我能在这里找到更多的选择,那就太好了。提前致谢。

【问题讨论】:

    标签: c++ boost shared-ptr


    【解决方案1】:

    boost::message_queue 更适合进程间通信。如果您只想进行线程间消息传递,我宁愿使用一个简单的队列(具有适当的同步)来保存您的 shared_pointers。

    【讨论】:

    • 特别是,对于替代方案,我建议您查看 TBB:英特尔的线程构建块库。
    【解决方案2】:

    boost::interprocess library 特别适合您的需求,因为它是compatible with the boost::smart_ptr library。总结如下:

    Boost.Interprocess 简化了普通进程间的使用 通信和同步机制,并提供了广泛的 其中:

    1. 共享内存。
    2. 内存映射文件。
    3. 信号量、互斥体、条件变量和可升级互斥体类型 将它们放在共享内存和内存映射文件中。
    4. 这些同步对象的命名版本,类似于 UNIX/Windows sem_open/CreateSemaphore API。
    5. 文件锁定。
    6. 相对指针。
    7. 消息队列。

    如您所说,信号量功能似乎足够

    我正在开发的模块由几个线程组成(类似于生产者/消费者), 之间的消息传递

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2011-08-29
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多