C++의 읽기/쓰기 잠금 개념
판독기/작성기 잠금은 스레드가 읽기 또는 쓰기에 대한 잠금을 획득할 수 있도록 하는 동기화 메커니즘으로, 리소스가 수정되는 동안 한 스레드가 다른 스레드가 리소스에 액세스하는 것을 차단하지 않습니다.
글로벌 캐시 또는 조회 테이블과 같은 읽기 전용 공유 데이터 구조를 구현하는 데 자주 사용됩니다. 판독기/기록기 잠금은 조건 변수 또는 뮤텍스를 사용하여 구현할 수 있습니다.
리더/라이터 잠금의 목적 및 용도
판독기 잠금은 판독기가 데이터를 변경할 수 없을 때 사용됩니다. 작성자 잠금은 작성자가 데이터를 수정하기 위해 독점 액세스를 원할 때 사용됩니다.
판독기 잠금은 “읽기 전용” 잠금이라고도 하며 다중 사용자 시스템에서 흔히 볼 수 있습니다. 하나 이상의 독자가 데이터에 영향을 주지 않고 데이터에 액세스할 수 있도록 하는 반면 작성자는 데이터에 대한 독점 액세스 권한이 있는 경우에만 데이터를 변경할 수 있습니다.
반면에 작성자 잠금은 한 번에 한 사람만 파일에 변경 내용을 쓸 수 있어야 할 때 사용됩니다. 이렇게 하면 동시 쓰기가 방지되고 서로 다른 시간에 다른 사람이 만든 업데이트 간에 충돌이 발생하지 않습니다.
C++에서 판독기/작성기 잠금을 구현하는 단계
C++에서 판독기/작성기 잠금은 몇 단계로 구현할 수 있습니다.
- 먼저 잠금으로 보호되는 리소스에 대해
shared_ptr
로 잠금을 초기화해야 합니다. - 둘째, 필요할 때 잠금을 획득하고 해제하는 기능을 만들어야 합니다.
- 셋째,
acquire
및release
기능을 적절한 시점에 호출해야 합니다. - 넷째, 다른 스레드가 이미 보유하고 있는 동일한 리소스를 기다리고 있는지 확인하고, 그렇다면 다시 획득하기 전에 리소스를 해제할 때까지 기다리는 기능을 만들어야 합니다.
- 다섯째, 2단계의
acquire
및release
기능에서 이 기능을 호출합니다.
예:
#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 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