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

时间:2017-11-29 07:46:12

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

我有一个班,有几个读者和几个作家。 我想使用读/写锁(使用shared_mutex

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

我想以这种方式使用(因为我在这里解释)shared_mutex

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

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

我该怎么做?

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

1 个答案:

答案 0 :(得分:2)

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

#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();
}