如何从一个函数锁定 shared_mutex 并从另一个函数解锁?

How to lock shared_mutex from one function and unlock it from other function?

我有一个 class,它有几个读者和几个作者。 我想使用 read/write 锁(使用 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();
}