7

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

我们需要同步一些访问,并且我们测量到使用 Win32 Mutex 对性能的影响太大了。

CRITICAL_SECTION 由于它的某些高级功能,无法将其放入共享内存中。

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

在推出自己的产品之前,我想看看是否有强大的实现可以处理轻量级、快速和在多个进程的共享内存中工作的要求,但这似乎对我来说有点难以用谷歌搜索。(而且,无论如何,CodeProject 很受欢迎,通常很难判断它是玩具代码还是“健壮”。)

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

4

1 回答 1

1

共享内存是当前的热门话题,

试试 boost::InterProcess - 它提供了可以使用的机制并利用了 x-platform 的通用代码。

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

作为参考,该事物也将 Atomic OPs 用于互斥锁:

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);
}

同样从“下面的聊天”中查看这篇文章的最佳答案: Boost's scoped mutex and WinAPi's critical section之间有区别吗?

于 2012-11-23T15:50:04.173 回答