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

eniak님의 프로필 이미지
eniak

작성한 질문수

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

Lock-Free Stack #2

TryDelete 함수 질문 드립니다

작성

·

188

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가 참조하고 있는 주소값을 참조할 수 없게 된다.

이렇게 이해하면 될까요?

답변 1

0

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

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

eniak님의 프로필 이미지
eniak

작성한 질문수

질문하기