【问题标题】:Is there an 'upgrade_to_unique_lock' for boost::interprocess?boost::interprocess 是否有“upgrade_to_unique_lock”?
【发布时间】:2010-11-11 17:45:57
【问题描述】:

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

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

但是,即使在读取器上使用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

【问题讨论】:

  • 我已将您的解决方案移至社区 wiki。

标签: c++ boost interprocess multiprocess


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这让我朝正确的方向挖掘。我曾多次查看文档,但有时我有点笨拙。具体来说,我缺少的是 unlock_upgradable_and_lock 调用,它似乎完全符合我的需要——阻止读者直到作者完成写作。
  • 两年后的答案是boost::thread的这个设施仍然不在boost::interprocess吗? upgrade_to_unique_lock 我的意思是。这似乎是合乎逻辑的事情。
【解决方案2】:

OP 的解决方案。

答案,如问题 cmets 中所述,使用成员函数unlock_upgradable_and_lock。如果有一个boost::interprocess 模拟到upgrade_to_unique_lock,我不知道它在哪里。但是writer()函数可以改写为:

while (1) {
  // Get upgrade lock on the mutex
  myMutex.lock_upgradable();

  // Get exclusive access and block everyone else
  myMutex.unlock_upgradable_and_lock();

  // Write values here

  // Unlock the mutex (and stop blocking readers)
  myMutex.unlock();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多