inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

SpinLock 질문입니다.

해결된 질문

147

chvj7567

작성한 질문수 7

1

CAS 의사코드 보면서 든 의문입니다. _locked와 expected가 같을 때 expected = _locked을 하는 작업이라든가 필요없을 것 같은 작업들이 있는 것 같아 아래와 같이 작성하여보았습니다. 작동은 똑같이하는데 문제가 생길 것이 있을까요?

bool check(bool& locked)
{
	if (!locked)
	{
		return locked = true;
	}
	else
	{
		return false;
	}
}
class SpinLock
{
public:
	void lock()
	{
		/*bool expected = false;
		bool desired = true;*/
		// CAS (Compare-And-Swap)
		// 의사 코드
		/*if (_locked == expected)
		{
			expected = _locked;
			_locked = desired;
			return true;
		}
		else
		{
			expected = _locked;
			return false;
		}*/

		/*while (_locked.compare_exchange_strong(expected, desired) == false)
		{
			expected = false;
		}*/
		while (check(_locked)) {}
	}

	void unlock()
	{
		_locked = false;
	}
private:
	bool _locked = false;
	//atomic<bool> _locked = false;
};

 

MMORPG windows-server network

답변 1

0

Rookiss

네 안됩니다.
싱글쓰레드 코드에 익숙했던 뇌를
말랑말랑하게 바꿔서 멀티쓰레드에 적응하는게 중요합니다.
CAS의 핵심은 단순히 의사코드가 아니라
의사코드가 '한번에' 이루어진다는 점입니다.



이 부분에서 if (!locked) 체크하는 부분과
return locked = true 하는 부분이 둘로 나뉘어져 있습니다.
따라서 다수의 쓰레드가 거의 동시에 접근해서 타이밍이 맞아 떨어지면
if(!locked)를 여럿이 통과해서 locked = true로 통과할 수 있습니다.
그러면 사실상 상호배타적인게 아니라 lock을 여러 쓰레드가 획득할 수 있다는 얘기가 되는거라 모순이죠.

writeLock을 잡을때 꼭 empty 상태여야하는 이유?

0

63

2

Memory Pool에서 오버플로우 질문입니다.

0

94

2

포토폴리오 및 진로 관련하여 고민입니다.

0

172

1

포토폴리오 관련 고민입니다.

0

91

1

실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.

0

107

2

성능 테스트 결과

0

117

2

게임 서버 Stateful, Stateless 진로 고민

0

147

1

WaitOnAddress와 Sleep의 차이 질문

0

98

1

궁금한거 있습니다.

0

92

2

JobTimer 구동 스레드

0

116

2

TryPop() 동작 관련 질문

0

86

1

로드맵 C#서버 C++서버 방향성 질문

0

162

2

스레드 id를 출력할떄 메인스레드 id도 출력되나요?

0

81

1

생명주기를 위한 의도적 복사

0

94

2

락프리의 실무에서 사용 질문

0

154

2

32bit threadID와 16비트 상위 WriteFlag에 대해

0

109

2

mutex와 sleep 차이점

0

133

1

실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다

0

167

2

Stomp Allocator의 Release함수에 대한 질문입니다.

0

102

1

공부법 관련해서

0

190

2

MakeShared 함수 관련

0

119

1

지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.

0

152

2

운영체제관련 질문입니다

0

144

1

send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.

0

125

2