c++ - 如何从一个函数锁定 shared_mutex 并从另一个函数解锁它?

标签 c++ c++11 c++14 std c++17

我有一个有几个读者和几个作家的类(class)。 我想使用读/写锁(使用shared_mutex)

有关此锁的所有示例和信息,在同一个函数中使用和释放锁: std::shared_mutex

我想以这种方式使用(出于我不想在这里解释的原因)shared_mutex:

Lock4Read();
UnLock4Read();
Lock4Write();
UnLock4Write();

所以我可以锁定我需要的对象,执行我的逻辑,并在最后(在其他函数中)释放它。

我该怎么做?

我知道我可以使用 linux pthread_rwlock_rdlock 来实现,但是我可以使用 shared_mutex 来实现吗?

最佳答案

我不太确定你是否想做那样的事情,但检查一下,也许它会对你有所帮助:)

#include <iostream>
#include <mutex>
#include <shared_mutex>
#include <thread>

class ThreadMom {
 public:
  void Lock4Read() { mutex_.lock_shared(); }
  void UnLock4Read() { mutex_.unlock_shared(); }
  void Lock4Write() { mutex_.lock(); }
  void UnLock4Write() { mutex_.unlock(); }
 private:
  std::shared_mutex mutex_;
};

template <typename T> class Value {
 public:
  T get() const {return value_;}
  void set(const T& value) {value_ = value;}
 private:
  T value_;
};

int main() {
  ThreadMom mom;
  Value<int> value;
  value.set(0);
  auto increment_and_print = [&mom, &value](int which) {
    for (int i = 0; i < 3; i++) {
      mom.Lock4Write();
      value.set(i * which);
      mom.UnLock4Write();
      mom.Lock4Read();
      std::cout << std::this_thread::get_id() << ' ' << value.get() << '\n';
      mom.UnLock4Read();
    }
  };

  std::thread thread1(increment_and_print, 1);
  std::thread thread2(increment_and_print, 2);

  thread1.join();
  thread2.join();
}

关于c++ - 如何从一个函数锁定 shared_mutex 并从另一个函数解锁它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47547517/

相关文章:

c++ - 当键是一对时在 map 中使用 .find() 函数

c++ - 检测对临时的悬空引用

c++ - 错误:命名空间 'enable_if_t'中没有名为 'std'的模板;你是说 'enable_if'吗?

C++:左值引用和右值引用的转换

c++ - 默认构造函数的不同声明的链接器错误

c++ - std::enable_if_t 将字符串与非字符串函数参数分开

C++ 包括 .cpp : avoiding multiple definition errors

c++ - 使用 std::string 隐式构造 NSString

c++ - 将数字均匀分布到具有相等值的 n 个元素的数组中

c++ - std::atomic 在一个简单的 POD 类上