c++ - 是否有用于 boost::interprocess 的 'upgrade_to_unique_lock'?

标签 c++ boost interprocess multiprocess

我正在寻找在偏向编写器读取器/编写器模型中的两个(或多个)进程之间有效共享数据 block 的最佳方法。

我当前的测试是使用 boost::interprocess。我已经创建了一些 managed_shared_memory 并试图通过使用存储在共享内存中的进程间互斥来锁定对数据 block 的访问。

但是,即使在读取器上使用 sharable_lock 并在写入器上使用 upgradable_lock 时,客户端在写入操作期间将读取碎片值而不是阻塞。在单个进程中的线程之间进行类似的读写器设置时,我使用 upgrade_to_unique_lock 来解决这个问题。但是,我还没有找到它的 boost::interprocess 等价物。有吗?

服务器(编写器):

while (1) {
  // Get upgrade lock on the mutex
  upgradable_lock <MutexType> lock(myMutex);

  // Need 'upgrade_to_unique_lock' here so shared readers will block until
  // write operation is finished.

  // Write values here
}

客户端(读者)

while (1)
{
  // Get shared access
  sharable_lock <MutexType> lock(myMutex);

  // Read p1's data here -- occasionally invalid!
}

我想手头更大的问题是:进程间互斥体是否是在偏向编写器的设置中访问进程间共享内存的正确方法?

注意:使用 Boost 1.44.0

最佳答案

所有 Boost.Interprocess 可升级锁都支持根据 this 升级.定义 here .

关于您的更广泛的问题 - 我认为这正是您想要的。读者仍然可以并发工作,你必须防止并发写入。除非您可以对共享内存进行分区以保证更受限的访问,否则这看起来是最好的。

关于c++ - 是否有用于 boost::interprocess 的 'upgrade_to_unique_lock'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4157491/

相关文章:

c++ - VS2008 是否支持 C++0x?

c++ - 为什么c++中的const转换运算符没有意义?

c++ - 如何为类型列表中的每个继承类型调用非默认构造函数?

c++ - boost::interprocess 共享互斥锁和 boost 共享互斥锁的进程间条件变量

c++ - 如何比较 C++ 中的类类型?

c++ - 部署的Qt应用程序QtWebEngineProcess无法加载Qt5Core.dll

c++ - 通用等价于 std 函数对象

c++ - 如何在 boost::spirit 规则中使用 boost::tuple 作为属性?

delphi - 跨进程单例对象

c# - 在 C# 中进行进程间通信 (IPC) 的最简单方法是什么?