inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Lock-Free Stack #2

TryDelete 함수 질문 드립니다

236

eniak

작성한 질문수 9

0

bool TryPop(T& value)
{
	++_popCount;

	Node* oldHead = _head;

	while (oldHead && _head.compare_exchange_weak(oldHead, oldHead->next) == false)
	{
	}

	if (oldHead == nullptr)
	{
	--_popCount;
	return false;
	}

	value = oldHead->data;
	TryDelete(oldHead);
	return true;
}

void TryDelete(Node* oldHead)
{
	// 나 외에 누가 있는가?
	if (_popCount == 1)
	{
		// 나 혼자네?
		// 내 데이터는 삭제
		delete oldHead;
	}
	else
	{
	}
}

_popCount == 1일 때 추가로 확인을 하지 않아도

delete oldHead를 해도 된다고 설명해주셨는데요.

코드가 TryDelete 함수 호출까지 진행됐으면

CAS를 빠져나오면서 _head = oldHead->next로 _head 값을 바꿔놓게 되고,

TryPop에 새로 진입하는 thread는 현재 thread의 oldHead가 참조하고 있는 주소값을 참조할 수 없게 된다.

이렇게 이해하면 될까요?

MMORPG windows-server network

답변 1

0

Rookiss

네 어려운 부분인데 잘 이해하셨습니다.

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

0

55

2

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

0

95

1

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

0

49

1

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

0

74

2

성능 테스트 결과

0

96

2

게임 서버 Stateful, Stateless 진로 고민

0

113

1

WaitOnAddress와 Sleep의 차이 질문

0

77

1

궁금한거 있습니다.

0

78

2

JobTimer 구동 스레드

0

103

2

TryPop() 동작 관련 질문

0

78

1

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

0

142

2

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

0

70

1

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

0

81

2

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

0

137

2

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

0

98

2

mutex와 sleep 차이점

0

114

1

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

0

149

2

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

0

91

1

공부법 관련해서

0

179

2

MakeShared 함수 관련

0

110

1

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

0

140

2

운영체제관련 질문입니다

0

127

1

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

0

114

2

메모리 풀 질문있습니다.

0

119

1