std::shared_mutex 与 std::shared_lock 是读者或作者的首选

std::shared_mutex with std::shared_lock is reader or writer preferring?

本文关键字:shared std mutex lock      更新时间:2023-10-16

在实现读写器锁时,我们可以利用std::shared_mutexstd::shared_lockstd::lock_guardstd::unique_lock

问题>这个新的专题作者或读者更喜欢吗?

根据安德鲁的评论进行更新

参考:

  // Multiple threads/readers can read the counter's value at the same time.
  unsigned int get() const {
    std::shared_lock<std::shared_mutex> lock(mutex_);
    return value_;
  }
  // Only one thread/writer can increment/write the counter's value.
  void increment() {
    std::unique_lock<std::shared_mutex> lock(mutex_);
    value_++;
  }

正如你从上面的例子中看到的,我无法控制读取器/写入器的优先级。

在实践中:

  • libc++总是使用Howard提到的互斥+条件变量技术,这并不奇怪。
  • libstdc++ 在可用的情况下使用pthread_rwlock_t,如果不是,则回退到 Howard 提到的算法。因此,如果pthread_rwlock_t可用,则使用的算法取决于 pthreads 实现。我相信 glibc 默认更喜欢读者。
  • MSVC使用Windows SRWLOCK,其文档说

    无法保证请求的线程的顺序 所有权将被授予所有权;SRW 锁既不公平也不公平 先进先出。

它都不是(如果实现得当(。 相反,读者和作家是通过公平的技术选择下一个。 这就是为什么这个特征既不能在 API 中设置,也不能指定。

这个答案详细介绍了如何实现这一点。