【问题标题】:Multiple-Reader, Single-Writer Lock in Boost WITH Writer BlockBoost WITH Writer 块中的多读取器、单写入器锁定
【发布时间】:2014-09-16 22:54:28
【问题描述】:

答案here几乎做了我想要的。

我想要一个读写锁:

  1. 只要没有写入器,就允许读取器获取锁
  2. 如果作者尝试锁定,请阻止新读者获取它,但允许老读者在给作者锁定之前完成
  3. 一旦作者释放锁,允许新的读者

上述实现不符合标准 (2)。它允许新读者抓住锁并阻止作者,直到他们完成。

【问题讨论】:

  • 当作家获得锁定时,现有的读者怎么办?
  • 他们保留它。正如 (2) 中所说,它应该只阻止 new 读者。
  • 这听起来不像是一个可行的锁定系统 :)
  • 你为什么这么认为?
  • 如果新的写入者可以在他们下面修改它,现有的读取器可能会遇到不一致的状态。

标签: c++ multithreading boost mutex


【解决方案1】:

找到了。我需要unique_lock 而不是upgrade_to_unique_lock

boost::shared_mutex _access;
void reader()
{
    // get shared access
    boost::shared_lock<boost::shared_mutex> lock(_access);
}

void writer()
{
    // wait for old shared access readers to finish
    // but block out new shared access readers
    boost::unique_lock<boost::shared_mutex> uniqueLock(_access);
}

【讨论】:

    【解决方案2】:

    但是这里你的“writer”方法没有“lock”属性。你的意思是在“unique_lock”之前你还需要做“upgrade_lock”吗?比如:

    void writer()
    {
        // get upgradable access
        boost::upgrade_lock<boost::shared_mutex> lock(_access);
    
        // get exclusive access
        boost::unique_lock<boost::shared_mutex> uniqueLock(lock);
        // now we have exclusive access
    }
    

    或者你是否混合了属性,它应该是:

    void writer()
    {
        boost::unique_lock<boost::shared_mutex> uniqueLock(_access);
        // now we have exclusive access
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      相关资源
      最近更新 更多