c++ - 共享内存的强大 CRITCAL_SECTION?

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

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

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

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

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

在我自己动手之前,我想看看是否有强大的实现可以满足轻量级、快速和在多个进程的共享内存中工作的要求,但似乎这有点难以谷歌为了我。 (而且,无论如何,CodeProject 成功了,通常很难判断它是玩具代码还是“健壮的”。)

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

最佳答案

共享内存是目前比较热门的话题,

尝试 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

作为引用,这个东西也使用 Atomic 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?

关于c++ - 共享内存的强大 CRITCAL_SECTION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13532189/

相关文章:

c++ - OpenGL Superbible 第一个程序崩溃

c++ - 不保存任何图像..保存视频帧时

C++ WndProc 获取消息的X和Y坐标

c++ - 是否有 `shared_lock_guard`,如果没有,它会是什么样子?

c - 以只读模式线程锁定结构(C11 stdatomic)

c++ - 如何以线程安全的方式初始化 C++ 全局互斥量

c++ - 如何避免从文件中读取错误的 '\n'?

c++ - 嵌套的 boost (预处理器)序列

c++ - 获取运行应用程序的 ip

c++ - 模板相关参数类型