inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Lock Free 관련하여 질문드립니다.

398

choiseonmun

작성한 질문수 4

0

예제 코드를 보면 TryPop을 아래와 같이 구현하고 있습니다.

bool TryPop(T& outData)
{
    Node* oldHead = _head.load();
    
    Node* expected = oldHead;
    Node* desired = oldHead->Next;
    while (oldHead && false == _head.compare_exchange_weak(expected, desired))
    {
        // Null
    }

    if (_head.load() == nullptr)
    {
        return false;
    }

    // 이하 생략
}

혹시 위의 코드에서 아래처럼 미리 Null check를 해도 무관할까요?

bool TryPop(T& outData)
{
    if (_head.load() == nullptr)
    {
        return false;
    }

    Node* oldHead = _head.load();
    
    Node* expected = oldHead;
    Node* desired = oldHead->Next;
    while (false == _head.compare_exchange_weak(expected, desired))
    {
        // Null
    }

    // 이하 생략
}

실제로 돌렸을 때는 문제가 없었는데, 혹시 제가 간과한 부분이 있나 하여 여쭤봅니다.

lock-free network atomic MMORPG windows-server

답변 1

0

Rookiss

if (oldHead == nullptr)
   return false;

이렇게 되어 있을거 같은데,
혹시 몇 번 강의를 말씀하시는걸까요?

Node* oldHead = _head; 를 추출한 다음에
뒤늦게 if (oldHead == nullptr) 체크하는거랑
또 다시 if (_head == nullptr) 체크 하는거랑은 의미가 달라집니다.


0

choiseonmun

Lock Free Stack 구현하는 부분이었습니다. 네, 강사님이 말씀하신 것처럼 구현이 되어 있는데, 제가 코드를 옮기는 과정에서 복사 붙어넣기를 잘못했네요. 다시 질문을 드리자면..

원본 코드

bool TryPop(T& value)
{
    Node* oldHead = _head;
    while (oldHead && _head.compare_exchange_weak(oldHead, oldHead->next== false)
    {
    }

    if (oldHead == nullptr)
        return false;

    // 이하 생략
}

구현 시도(?)하려는 코드

bool TryPop(T& value)
{
    // 사전에 먼저 쳐내도 괜찮은지 궁금합니다.
    if (nullptr == _head.load())
        return false;

    Node* oldHead = _head;
    while (false == _head.compare_exchange_weak(oldHead, oldHead->next))
    {
    }

    // 이하 생략
}

주석처럼 사전에 먼저 조건 검사를 해도 괜찮은지 궁금합니다.

0

Rookiss

사전에 검사를 해도 되긴 하지만, 그렇다고 뒷부분을 누락할 수는 또 없습니다.

데이터는 1개이고 2개의 쓰레드가 Pop을 한다면, CAS 경합을 통해 한 애는 성공하겠지만
다른 애는 실패할테니 그러면 return false가 뜨긴 떠야 할테니
뒷부분의 체크가 필요하겠죠.

0

choiseonmun

아 어떤 상황인지 알겠네요. Lock Free의 세계란 어렵군요...현업에서 Lock Free 자료구조를 많이 쓰는 편인가요 ??

0

Rookiss

절대 그렇지 않습니다 ㅎㅎㅎ
쓰더라도 라이브러리를 갖다 쓰지,
직접 만들 일은 사실상 없으니
그냥 공부하는 목적으로만 참고하시면 됩니다 ^^
참고로 전 LockFree를 극혐하는 파에 가깝습니다.

0

choiseonmun

답변 감사드립니다 ㅎㅎㅎ..

아 추가적으로 질문이 하나 더 있는데, 유니코드는 잘 사용하지 않나요? 제프리 리처의 Windows via C/C++ 책을 좀 본 적이 있는데, Windows의 문자열 처리가 내부에서는 유니코드로 처리되어서 ANSI 코드는 약간의 성능 하락이 있다고 들어서요. 🤔

0

Rookiss

유니코드도 물론 사용합니다.

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

0

59

2

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

0

99

1

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

0

55

1

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

0

78

2

성능 테스트 결과

0

98

2

게임 서버 Stateful, Stateless 진로 고민

0

115

1

WaitOnAddress와 Sleep의 차이 질문

0

79

1

궁금한거 있습니다.

0

79

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

92

1

공부법 관련해서

0

179

2

MakeShared 함수 관련

0

111

1

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

0

140

2

운영체제관련 질문입니다

0

127

1

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

0

114

2

메모리 풀 질문있습니다.

0

120

1