작성
·
539
0
안녕하세요.
제가 제대로 이해한 게 맞을까요.
1. Write lock
ㄱ. 같은 스레드끼리는 상호배타적이지 않음
ㄴ. 다른 스레드가 접근했을 때는, spin(5000번). 시간 초과나면 CRASH
2. Read lock
ㄱ. 같은 스레드는 Write lock을 획득한 상태에서 Read lock 획득 가능. 다른 스레드는 불가
ㄴ. Write lock을 획득한 스레드가 없다면(lock을 소유한 스레드가 없다면) 다른 스레드들도 경합 없이 Read lock을 획득할 수 있음(lock을 소유한 스레드가 있다면, 소유하지 않을 때까지 spin)
ㄷ. Read lock을 획득한 상태에서는 Write lock이 획득될 수 없음(읽기 동작 중엔 쓰기가 안 됨)
3. 궁금한 점
ㄱ. 동일한 스레드가 공유 자원에 Write lock을 복수로 획득하고 쓰기 동작을 하는 게 문제가 전혀 안 생기는 건가요? 아니면 문제 생길 수도 있는 것을 고려하여 사용해야 하는 걸까요.
ㄴ. 동일 스레드는 Write lock을 획득한 상태에서 Read lock을 획득할 수 있는 것은 싱글 스레드 기준 쓰기/읽기 동작이 동시에 일어날 수 없기 때문일까요?
감사합니다.
답변 1
1
ㄱ.
이건 RW락 구현 정책에 따라 다른데
강의에서 구현한 버전에서는 동일 쓰레드가 연속적으로 Write->Write->Write 락을 연속해서
잡을 수 있고 아무 문제가 없습니다.
컨텐츠 개발할 때 이렇게 구현하는게 더 편하기 때문인데
이미 만든 Lock 잡는 함수에서 다른 Lock잡는 함수를 호출할 수도 있기 때문입니다.
다만 모든 라이브러리가 그렇진 않고 프로젝트에서 사용하기 전에 여러 정책을 확인을 해봐야 합니다.
(Write -> Read 되는지, 락 중첩 여부 등등)
ㄴ.
이 또한 정책에 따라 갈리는데 강의에서 구현한 RW락에서는
동일 쓰레드가 Write Lock을 잡은 상태라면,
다른 쓰레드는 얼씬도 못하는 상태이고 상호배타적 특성이 보장되기에
Read도 통과시켜준 것에 불과합니다.
다만 대부분 RW락 라이브러리에서는 Write->Read를 지원하지 않거나,
다른 특수 함수를 이용해야 하는 경우가 더 많습니다.
답변 감사합니다🙏