boost 에선 세가지 모드를 지원하는걸로 기억하는데,
stl 에서 제공하는 shared_mutex 는 upgradable 인가를 지원안할거임.
그래서 exclusive mode 랑 shared mode 두가지를 지원함.
한마디로, ( exclusive ) unique_lock 은 기존의 mutex 를 lock 하는것과 거의 같은 동작임.
누가 lock 을 걸었으면 걔가 풀때까지 자원에 접근할 수 없음.
shared_lock 을 걸면 shared_lock 을 건 쓰레드들끼리는 읽기 전용으로 접근한다는 약속하에 접근이 허가됨.
무슨 말인고 하니,
어떤 상점에 물건을 파는데, 구경은 공짜, 살 사람만 만지시오. 라고 써붙인 상황인것임.
1. 어떤 사람이 사려고 만지는 동안은 아무도 구경 못함. ( unique_lock 일때는 shared_lock 이 걸리지 않음 )
2. 구경하는 사람이 있을땐 구경은 할 수 있음 ( shared_lock 일때, 다른 쓰레드도 shared_lock 가능 )
3. 구경하는 사람이 있을땐 사지도 못함 ( shared_lock 일때, unique_lock 을 걸 수 없음 )
4. 당연하지만 사려는 사람이 만지는 동안은 다른 사람이 사려고 만질 수 없음 ( unique_lock 일때 unique_lock 을 걸 수 없음 )
즉, 읽기용 락은 복수가 가능하지만 읽기용 락중엔 쓰기용 락이 안됨.
쓰기용 락일 때는 추가로 읽기용 락도 안되고 쓰기용 락도 안됨.
수정등의 공유데이타 변경을 한 쓰레드에서만 하고 여러쓰레드에서는 읽기만 할때,
읽는 애들끼리 lock 의 방해를 주고 받지 않도록 유연성을 부여해 설계된 mutex 란거임.
ツンデレですね!
츤츤~
님은 이런걸 어디서 배우나요?
개념은 OS 시간에 배웠지. 막상 구현하다보면 read_mutex 와 write_mutex 를 따로 만들게 되거든.
정확히 말하면 read_mutex 인건 아니지만. 논리적으론 그렇단 이야기.
즉, 그냥 두 그룹이 하나의 뮤텍스를 건들고 스위칭하고 이게 귀찮지.
읽기용 그룹은 별도로 하나의 모드로서 뮤텍스에 접근하게 관리하게 된단 말이지. 그게 불편하니까 저런게 나온거라. 나오면 바로 스펙만 대강 읽어도 알 수 있지.
그냥 rwlock(reader/writer lock) 혹은 producer/consumer lock인데, OS책 보면 주구장창 나온다. OS책 보렴