首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有“upgrade_to_unique_lock”表示boost::interprocess?

是否有“upgrade_to_unique_lock”表示boost::interprocess?
EN

Stack Overflow用户
提问于 2010-11-11 17:45:57
回答 2查看 1.3K关注 0票数 4

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

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

但是,即使在读取器上使用sharable_lock,在写入器上使用upgradable_lock时,客户端也会在写操作期间读取分段值,而不是阻塞。在单个进程中在线程之间执行类似的读取器/写入程序设置时,我使用upgrade_to_unique_lock解决了这个问题。但是,我还没有找到它的boost::interprocess等效项。有一个存在吗?

服务器(写入器):

代码语言:javascript
复制
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
}

客户(读者)

代码语言:javascript
复制
while (1)
{
  // Get shared access
  sharable_lock <MutexType> lock(myMutex);

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

我想更大的问题是:进程间互斥甚至是访问有作者偏见的设置中进程之间共享内存的正确方式吗?

注:使用Boost 1.44.0

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-11 18:34:37

所有Boost.Interprocess可升级锁支持每个升级。定义这里.

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

票数 3
EN

Stack Overflow用户

发布于 2017-08-29 17:23:07

执行部分的解决方案。

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

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4157491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档