强大的CRITCAL_SECTION共享内存?

时间:2012-11-23 15:46:21

标签: c++ visual-c++ mutex shared-memory critical-section

我们在Windows上的流程中共享一些数据结构。 (通过所有这些进程加载的DLL中的共享数据段。)

我们需要同步一些访问,并且我们测量使用Win32 Mutex的性能损失太高。

CRITICAL_SECTION cannot由于其某些高级功能而被放入共享内存中。

这使我们需要一个简单的锁定/互斥解决方案,直接基于Win32上的Interlocked*函数族。

在推销自己之前,我想看看是否有强大的实现可以处理轻量级,快速和在多个进程的共享内存中工作的要求,但似乎这是一个有点难以谷歌的东西为了我。 (而且,无论如何,CodeProject会发现,通常很难判断它是玩具代码还是“强大”。)

所以我需要的东西可能被称为用户模式递归互斥锁,当放在Windows上的共享内存中时适用于多个进程(注意只需要保存锁定部分) ,我可以忍受初始化的限制/附加要求。

1 个答案:

答案 0 :(得分:1)

共享内存目前是一个热门话题,

尝试使用boost :: InterProcess - 提供可以使用的机制并利用通用代码x平台。

http://www.boost.org/doc/libs/1_52_0/doc/html/interprocess/sharedmemorybetweenprocesses.html

另一个原因是该库提供了同步机制以及将来可能有用的其他IPC机制。

http://www.boost.org/doc/libs/1_52_0/doc/html/interprocess/synchronization_mechanisms.html

作为参考,该东西使用原子OP以及互斥锁:

http://www.boost.org/doc/libs/1_52_0/boost/interprocess/sync/spin/mutex.hpp

inline void spin_mutex::lock(void)
{
   do{
      boost::uint32_t prev_s = ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0);

      if (m_s == 1 && prev_s == 0){
            break;
      }
      // relinquish current timeslice
      ipcdetail::thread_yield();
   }while (true);
}

同样来自“下面的聊天”这篇文章的最佳答案: Is there a difference between Boost's scoped mutex and WinAPi's critical section?