代码之家  ›  专栏  ›  技术社区  ›  Courtney Christensen

boost::进程间是否有“升级到唯一锁”?

  •  4
  • Courtney Christensen  · 技术社区  · 14 年前

    我正在寻找在 作家偏见 读写器模型。

    我现在的测试是 boost::interprocess . 我创造了一些 managed_shared_memory 和am尝试使用存储在共享内存中的进程间互斥锁来锁定对数据块的访问。

    然而,即使使用 sharable_lock 关于读者和 upgradable_lock 在作者身上, 客户端将在写操作期间读取碎片值,而不是阻塞 . 在单个进程的线程之间执行类似的读写器设置时,我使用 upgrade_to_unique_lock 来解决这个问题。但是,我还没有找到 boost::进程间 相当于。有一个存在吗?

    服务器(写入程序):

    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!
    }
    

    我想现在面临的更大的问题是:进程间互斥甚至是在偏向writer的设置中访问进程间共享内存的正确方法吗?

    注意:使用Boost 1.44.0

    2 回复  |  直到 7 年前
        1
  •  3
  •   Steve Townsend    14 年前

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

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

        2
  •  0
  •   Cœur    7 年前

    操作解决方案。

    如问题注释中所述,答案是使用成员函数 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();
    }
    
    推荐文章