2011-11-15 48 views
2

我正在使用的模塊由幾個線程(類似於生產者/消費者)組成,它們之間的消息傳遞是通過發送生成的對象的地址通過boost :: message_queue發送函數完成的。跨線程的內存管理

到目前爲止,內存管理是通過實例化生產者線程中的對象並在用戶線程中將其刪除後顯式地完成的。

由於顯而易見的原因(控制複雜性並避免泄漏),現在我計劃使用自管理內存(智能指針/ boost shared_ptr)刪除此顯式管理。

我面臨的一個問題是boost :: message_queue發送/接收api在其簽名中使用原始指針,我希望跨線程共享內存。那麼,我如何管理引用計數,以便在生產者線程函數的作用域結束之後消息對象不會立即被銷燬,而且甚至在消費者線程完成其任務之前也不會被銷燬。

一種方法是獲取shared_ptr序列化並用它在線程之間傳遞。 有什麼更明顯的方式,我失蹤了?如果我能在這裏獲得更多選擇,那將是非常好的。提前致謝。

回答

4

boost :: message_queue更適合inter-進程通信。如果你只是想做線程消息傳遞,我寧願使用一個簡單的隊列(與適當的同步)持有你的shared_pointers。

+0

特別是,對於替代品,我建議看看TBB:Intel的線程構建模塊庫。 –

0

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. 消息隊列。

信號燈的能力似乎足以作爲你說,

我的工作在該模塊由一對夫婦線程(類似於生產者/消費者)的,

之間的 消息