본문 바로가기
💻 programming/c++

[c++] std::shared_mutex

by 연구원-A 2020. 12. 16.
반응형

en.cppreference.com/w/cpp/thread/shared_mutex

 

std::shared_mutex - cppreference.com

class shared_mutex; (since C++17) The shared_mutex class is a synchronization primitive that can be used to protect shared data from being simultaneously accessed by multiple threads. In contrast to other mutex types which facilitate exclusive access, a sh

en.cppreference.com

상호배타적인 다른 mutex들과 달리 shard_mutex는 공유 자원에 대한 두 가지 접근 방법을 제공합니다

  • shared - 여러 스레드가 mutex 소유권을 공유하는 방법
    • shared lock을 수행하는 경우 (lock_shared, try_lock_shared를 통해서), 다른 스레드는 shared lock을 수행할 수 있습니다. (exclusive lock는 불가능)
  • exclusive - 오직 하나의 스레드만 mutex 소유권을 갖는 방법
    • exclusive lock을 수행하여 소유권을 갖는 경우 (lock 또는 try_lock을 통해서), 다른 스레드는 lock을 수행할 수 없습니다

cf. 하나의 스레드에서는 한 종류의 lock만 호출할 수 있습니다 (exclusive lock 또는 shared lock).

shared_mutex는 공유 자원을 읽을 때는 소유권을 공유하고, 공유 자원에 값을 쓰는 경우에만 배타적으로 관리하고 싶을 때 유용하게 사용할 수 있습니다. 값을 읽을 때 (shared lock)는 다른 스레드에서 값을 읽더라도 (shared lock) 문제가 없고, 값을 쓸 때 (exclusive lock)는 다른 스레드에서 값을 읽거나 (shared lock) 쓰지 못하도록 (exclusive lock) 하는 경우를 예를 들 수 있습니다.

 

Member functions

Exclusive locking

  • lock
  • try_lock
  • unlock

Shared locking

  • lock_shared
  • try_lock_shared
  • unlock_shared

Sample code

#include <iostream>
#include <mutex>  // For std::unique_lock
#include <shared_mutex>
#include <thread>
 
class ThreadSafeCounter {
 public:
  ThreadSafeCounter() = default;
 
  // Multiple threads/readers can read the counter's value at the same time.
  unsigned int get() const {
    std::shared_lock lock(mutex_);
    return value_;
  }
 
  // Only one thread/writer can increment/write the counter's value.
  void increment() {
    std::unique_lock lock(mutex_);
    value_++;
  }
 
  // Only one thread/writer can reset/write the counter's value.
  void reset() {
    std::unique_lock lock(mutex_);
    value_ = 0;
  }
 
 private:
  mutable std::shared_mutex mutex_;
  unsigned int value_ = 0;
};
 
int main() {
  ThreadSafeCounter counter;
 
  auto increment_and_print = [&counter]() {
    for (int i = 0; i < 3; i++) {
      counter.increment();
      std::cout << std::this_thread::get_id() << ' ' << counter.get() << '\n';
 
      // Note: Writing to std::cout actually needs to be synchronized as well
      // by another std::mutex. This has been omitted to keep the example small.
    }
  };
 
  std::thread thread1(increment_and_print);
  std::thread thread2(increment_and_print);
 
  thread1.join();
  thread2.join();
}
반응형

'💻 programming > c++' 카테고리의 다른 글

[c++] lvalue reference and rvalue reference  (0) 2021.08.04
[c++] condition variable (조건 변수)  (0) 2020.12.17
[c++] std::timed_mutex  (0) 2020.12.16
[c++] std::recursive_mutex (std::mutex 비교)  (0) 2020.12.16
[c++] std::mutex  (0) 2020.12.16

댓글