작성
·
56
0
int desired = (Thread.CurrentThread.ManagedThreadId << 16) & WRITE_MASK;
while (true)
{
for(int i = 0; i < MAX_SPIN_COUNT; i++)
{
if (Interlocked.CompareExchange(ref _flag, desired, EMPTY_FLAG) == EMPTY_FLAG)
return;
}
Thread.Yield();
}
desired 부분에서 마스크를 통해 WriteThreadId를 제외하고 밀어버린 뒤 Interlocked부분에서 비교를 통해 ReadLock과 WriteLock이 없는지 비교하고 있습니다.
위 과정에서 만약 먼저 ReadLock이 잡혀있다면 ReadLock이 풀릴 때 까지 기다리게 되는데
만약 끊임없이 Read가 일어나 ReadLock이 풀리는 틈이 없어 Write가 되지않는 극단적인 경우는 일어나지 않는건가요?
혹시라도 일어나지 않는다면 Read 하는 과정이 매우 짧기 때문에 그런 일이 발생하지 않는 것인지 궁금합니다.
답변 2
0
위 과정에서 만약 먼저 ReadLock이 잡혀있다면 ReadLock이 풀릴 때 까지 기다리게 되는데
만약 끊임없이 Read가 일어나 ReadLock이 풀리는 틈이 없어 Write가 되지않는 극단적인 경우는 일어나지 않는건가요?
-> 코드의 이론상 일어날 수 있지만, 현실에선 일어나지 않는데
우리가 생각하는 것 이상으로 컴퓨터 실행 속도는 빠르기 때문입니다.
그리고 애당초 Read를 그렇게 오래 잡고 있는거라면 그냥 락 사용에 문제가 있는 것이고
대부분의 케이스에서는 단순하게 데이터를 읽고 함수를 리턴 시키기 때문에,
현실적으로 일어나지는 않습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 동혁님.
질문 주신 내용은 Multi-thread 환경에서의 스레드 동기화, 특히 ReaderWriterLock을 구현할 때의 WriteLock 대기 메커니즘과 관련 있습니다. 질문의 핵심은 끊임없이 ReadLock이 활성화되어 Write가 지연되는 상황에 대한 걱정이시군요.
기본적으로 ReaderWriterLock은 다중 Reader가 동시에 접근할 수 있도록 허용하는 동기화 메커니즘입니다. 그러나 WriteLock은 모든 다른 Reader와 Writer의 접근을 막아야 하므로, ReaderLock이 푼 후에만 WriteLock이 가능합니다.
유사한 질문에 대한 답변을 몇 가지 찾아보았으니 참고해 보세요:
WriteLock의 Yield부분이 헷갈려 질문 드립니다
이 질문에서는 Thread.Yield()
를 통해 다른 쓰레드에게 CPU를 양보하는 메커니즘과 언제 다시 시도해야 하는지를 다룹니다.
ReadLock 부분 질문입니다.
ReaderWriterLock의 ReadLock 구현에서 WriteLock이 활성화돼있는지 확인하는 과정에 대한 설명을 확인할 수 있습니다.
ReaderWriterLock 구현 연습 파트 질문입니다!
ReadLock이 WriteLock을 무시하고 있을 것이라는 의문에 대한 답변으로, Interlocked.CompareExchange
의 역할을 설명합니다.
극단적인 경우에도 적절히 동작하려면, ReadLock의 횟수를 제한하거나 우선순위 기반의 Lock을 적용하는 방식도 고려해 볼 수 있습니다. 예를 들어, 일정 기간 또는 횟수 후에는 WriteLock의 우선권을 부여함으로써 Starvation 현상을 방지할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다~