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

choiseonmun님의 프로필 이미지
choiseonmun

작성한 질문수

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

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

작성

·

341

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
    }

    // 이하 생략
}

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

답변 1

0

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

if (oldHead == nullptr)
   return false;

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

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


choiseonmun님의 프로필 이미지
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))
    {
    }

    // 이하 생략
}

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

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

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

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

choiseonmun님의 프로필 이미지
choiseonmun
질문자

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

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

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

choiseonmun님의 프로필 이미지
choiseonmun
질문자

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

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

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

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

choiseonmun님의 프로필 이미지
choiseonmun

작성한 질문수

질문하기