C++의 읽기/쓰기 잠금 개념

Muhammad Adil 2024년2월16일
  1. 리더/라이터 잠금의 목적 및 용도
  2. C++에서 판독기/작성기 잠금을 구현하는 단계
C++의 읽기/쓰기 잠금 개념

판독기/작성기 잠금은 스레드가 읽기 또는 쓰기에 대한 잠금을 획득할 수 있도록 하는 동기화 메커니즘으로, 리소스가 수정되는 동안 한 스레드가 다른 스레드가 리소스에 액세스하는 것을 차단하지 않습니다.

글로벌 캐시 또는 조회 테이블과 같은 읽기 전용 공유 데이터 구조를 구현하는 데 자주 사용됩니다. 판독기/기록기 잠금은 조건 변수 또는 뮤텍스를 사용하여 구현할 수 있습니다.

리더/라이터 잠금의 목적 및 용도

판독기 잠금은 판독기가 데이터를 변경할 수 없을 때 사용됩니다. 작성자 잠금은 작성자가 데이터를 수정하기 위해 독점 액세스를 원할 때 사용됩니다.

판독기 잠금은 “읽기 전용” 잠금이라고도 하며 다중 사용자 시스템에서 흔히 볼 수 있습니다. 하나 이상의 독자가 데이터에 영향을 주지 않고 데이터에 액세스할 수 있도록 하는 반면 작성자는 데이터에 대한 독점 액세스 권한이 있는 경우에만 데이터를 변경할 수 있습니다.

반면에 작성자 잠금은 한 번에 한 사람만 파일에 변경 내용을 쓸 수 있어야 할 때 사용됩니다. 이렇게 하면 동시 쓰기가 방지되고 서로 다른 시간에 다른 사람이 만든 업데이트 간에 충돌이 발생하지 않습니다.

C++에서 판독기/작성기 잠금을 구현하는 단계

C++에서 판독기/작성기 잠금은 몇 단계로 구현할 수 있습니다.

  1. 먼저 잠금으로 보호되는 리소스에 대해 shared_ptr로 잠금을 초기화해야 합니다.
  2. 둘째, 필요할 때 잠금을 획득하고 해제하는 기능을 만들어야 합니다.
  3. 셋째, acquirerelease 기능을 적절한 시점에 호출해야 합니다.
  4. 넷째, 다른 스레드가 이미 보유하고 있는 동일한 리소스를 기다리고 있는지 확인하고, 그렇다면 다시 획득하기 전에 리소스를 해제할 때까지 기다리는 기능을 만들어야 합니다.
  5. 다섯째, 2단계의 acquirerelease 기능에서 이 기능을 호출합니다.

예:

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

using namespace std;

class demo {
 public:
  void sam() {
    unique_lock lock(mutex_);
    ++b;
  }

  unsigned int get() {
    shared_lock lock(mutex_);
    return b;
  }

 private:
  mutable shared_mutex mutex_;
  unsigned int b = 0;
};

int main() {
  demo tbh;

  auto sam_and_roi = [&tbh]() {
    for (int x = 0; x < 6; x++) {
      tbh.sam();
      cout << this_thread::get_id() << tbh.get() << '\n';
    }
  };

  thread start(sam_and_roi);
  start.join();
}

위에서 언급한 예제의 작동을 확인하려면 여기를 클릭하십시오.

Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook