【问题标题】:How to create a ReadWriteMutex without specifying the semaphore's resource count?如何在不指定信号量的资源计数的情况下创建 ReadWriteMutex?
【发布时间】:2010-01-25 08:22:03
【问题描述】:

ReadWriteMutex 的常用模式是使用信号量并让写入器循环获取所有资源:

inline void write_lock() {
  ScopedLock lock(acquire_mutex_);
  for (size_t i=0; i < resource_count_; ++i) {
    if (sem_wait(semaphore_) < 0) {
      fprintf(stderr, "Could not acquire semaphore (%s)\n", strerror(errno));
    }
  }
}

这很好,只是您必须在信号量初始化期间指定资源计数,并且随意选择 10 或 99999 的资源计数感觉不对。是否有更好的模式可以允许“无限”读者(不需要资源计数)?

【问题讨论】:

    标签: c++ concurrency semaphore


    【解决方案1】:

    我找到了解决方案:使用pthread_rwlock_t(Windows 上的 ReaderWriterLock)。这些锁不需要特定的“max_readers_count”。

    我怀疑这个锁的实现使用某种条件变量来锁定读者条目,当作者需要写入和原子读者计数时。

    将此与我自制的基于信号量的锁进行比较表明编写器受到青睐(他们倾向于先运行)。

    【讨论】:

    • 我对性能结果感到惊讶:我的基于信号量的解决方案可以更均匀地交错读取和写入操作,并且运行速度更快(3.7s vs 4.2s)。
    • 这并不总是正确的:这取决于星期几和天气条件(似乎)。
    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多