다른 스레드가 write하고 있을 때 readlock 허용하나요?
207
작성한 질문수 14
ReadLock 코드
uint32 expected = (_lockFlag.load() & READ_THREAD_MASK);
if (_lockFlag.compare_exchange_strong(OUT expected, expected + 1)) return;WriteLock 코드
const uint32 desired = ((LThreadId << 16) & WRITE_THREAD_MASK);
...
uint32 expected = EMPTY_FLAG;
if (_lockFlag.compare_exchange_strong(OUT expected, desired))
{
_writeCount++;
return;
}Write할 때 lockFlag를 LThreadId << 16로 저장하기 때문에 첫 비트 ~ 15비트까지는 0으로 초기화가 될것입니다.
ReadLock에서는 Read용 Mask를 쓰는데 그럼 Write에서 초기화해준 lockFlag를 볼 수 없어서 항상 참값이 나와 expected + 1로 수정되는거 아닌가요??
다른 스레드가 Write하고 있을 때 Read를 허용하는것인지 궁금합니다.
답변 2
0
안녕하세요, 인프런 AI 인턴입니다. dpcks5959님.
주신 코드에서 ReadLock과 WriteLock의 상호작용에 관한 질문을 주셨군요. 비트 마스크와 compare_exchange_strong을 사용하는 점에서 혼란이 생길 수 있습니다. 이 질문에 대한 해결을 돕기 위해, 몇 가지 개념과 기존의 Q&A 링크를 공유드리겠습니다.
핵심 개념 요약:
비트 마스크 및 시프트:
LThreadId << 16로 상위 비트를 사용하여WRITE_THREAD_MASK에 의해 특정 Thread ID 값을 저장합니다. 이런 방식으로 기존의lockFlag의 하위 비트는 영향을 받지 않게 됩니다.
ReadLock 처리:
- ReadLock 코드에서의
READ_THREAD_MASK는 하위 비트만을 검사합니다. 즉,WriteLock이 설정된 상위 비트는 염두에 두지 않는 방식을 사용하며,expected값이 어떤 변화를 겪는지를 바탕으로 간접적으로 Write 상태를 판단합니다.
- ReadLock 코드에서의
따라서, 만약 다른 스레드가 Write Lock을 가지고 있을 경우에는 compare_exchange_strong이 실패하게 되고, 반복적으로 동일한 동작을 수행합니다. 결국 ReadLock이 성공하려면 WriteLock이 풀린 상태여야 합니다.
관련 질문 및 답변 링크:
다른 사용자가 비슷한 주제로 질문한 내용과 답변을 확인해 보시면 도움이 될 것입니다. 특히 명확한 예제와 설명이 첨부되어 있어 큰 도움이 될 것입니다:
이 질문과 답변은 reader-writer lock의 비트 연산과 마스킹의 사용에 대한 이해를 돕기 위해 작성된 좋은 사례입니다. 설명이 직관적이라면 이해하는 데 많은 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
Memory Pool에서 오버플로우 질문입니다.
0
63
2
포토폴리오 및 진로 관련하여 고민입니다.
0
112
1
포토폴리오 관련 고민입니다.
0
62
1
실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.
0
82
2
성능 테스트 결과
0
103
2
게임 서버 Stateful, Stateless 진로 고민
0
121
1
WaitOnAddress와 Sleep의 차이 질문
0
83
1
궁금한거 있습니다.
0
82
2
JobTimer 구동 스레드
0
107
2
TryPop() 동작 관련 질문
0
81
1
로드맵 C#서버 C++서버 방향성 질문
0
148
2
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
0
73
1
생명주기를 위한 의도적 복사
0
86
2
락프리의 실무에서 사용 질문
0
139
2
32bit threadID와 16비트 상위 WriteFlag에 대해
0
101
2
mutex와 sleep 차이점
0
117
1
실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다
0
152
2
Stomp Allocator의 Release함수에 대한 질문입니다.
0
96
1
공부법 관련해서
0
183
2
MakeShared 함수 관련
0
114
1
지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.
0
144
2
운영체제관련 질문입니다
0
131
1
send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.
0
117
2
메모리 풀 질문있습니다.
0
124
1





