인프런 커뮤니티 질문&답변

바른생활님의 프로필 이미지

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Reader-Writer Lock

생각을 해봤는데 이해가 잘 되지않습니다. 질문 드립니다

22.07.19 19:42 작성

·

341

0

안녕하세요. 

지금 ReadLock WriteLock 강의듣고 혼자서 구현해보는 연습중에 궁금한점이 있어서 문의드립니다.

 

Main부분에서 

	for (int i = 0; i < 2; i++) 
	{
		threaManger->Luncher(ThreadWrite);
	}


	for (int i = 0; i < 5; i++) 
	{
		threaManger->Luncher(ThreadRead);
	}

고유 스레드 아이디를 부여해서
스레드 2개는 Write("스레드 아이디" 1,2)
스레드 5개는 Read ("스레드 아이디" 3,4,5)
일을 시키는데
이렇게 되면 Read만 하는 스레드는 ReadLock만 잡고
Write만 하는 스레드는 WirteLock만 잡게 되어서
1번 아이디의 스레드(Write)가 Read Lock을 잡을 수 없지 않나요?
아래 코드에서 Readlock 함수를 보면
WRITE_THREAD_MASK를 씌어서 threadId를 비교하는데 이 부분은 실행 안될 거라고 생각되는데 맞나요?
실제로 디버그에서 ReadLock에 포인트를 잡고 봤는데 브레이크 포인트에 걸리지는 않았습니다.

제가 궁금한 걸 글로 쓰려니 잘 정리가 안돼서 죄송합니다.
질문을 요약하자면

1.ReadLock을 잡는 스레드의 id는 WriteLock을 잡는 스레드 id와 똑같을 수가 있나요?

 

// ReadLock
const int lockThreadId = (_lockFlag.load() & WRITE_THREAD_MASK) >> 16;
	if (lockThreadId == SharedThreadId)
	{
		_lockFlag.fetch_add(1);
		return;
	}


// WriteLock
const int lockThreadId = (_lockFlag & WRITE_THREAD_MASK) >> 16;
	if (lockThreadId == SharedThreadId) 
	{
		_writeCount++;
		return;
	}

답변 2

3

Lunch는 점심입니다

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2022. 07. 19. 21:18

예제만 생각하면 안 됩니다.
실제 상황에선 특정 쓰레드가 read, write 모두 할 수 있습니다.

바른생활님의 프로필 이미지
바른생활
질문자

2022. 07. 19. 21:57

친절하고 빠른 답변 감사합니다!