• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

JobQueue #1 12:40 초

21.03.29 00:07 작성 조회수 226

0

JobQueue #1 12:40 초 부분에 

'어차피 Pop을 실행하는 스레드는 Flush를 실행한 스레드 하나일뿐인데 왜 lock을 걸어줄까?'

의 답으로

'JobQueue에 일감을 Pop하는 동안에도, 넣는일을 다수의 스레드가 할 수 있기 때문이다.'

라고 답을 주셨는데 이부분이 좀 이해가 안 갑니다.  이해를 돕기위해 조금만 추가적으로 설명해 주실수 있을까요?

답변 1

답변을 작성해보세요.

1

말 그대로입니다!

JobQueue를 Pop하고 실행하는 애가 있다고 하더라도,
해당 JobQueue를 외부에서 접근하지 못하는 것은 아닙니다.
멀티쓰레드 특성상 다른 쓰레드들은 독립적으로 실행되기 때문에,
다른 쓰레드가 클라 요청을 받아서
작업중인 JobQueue에 다른 일감을 Push할 수도 있습니다.
따라서 나만 Flush한다고 안심한다고 그냥 Pop하면 안되고
lock을 걸어서 안전하게 데이터를 꺼내야 합니다.

조영웅님의 프로필

조영웅

질문자

2021.03.29

lock 부분을 다시 복습해 보니,

말씀하신대로 'Lock을 걸어서 안전하게 데이터를 꺼내야 한다' 라는 말이

멀티스레드에서 생기는 '경합 조건', '메모리 베리어 가시성' 같은 문제를 방지하기 위해

여러 스레드가 동시에 접근할 수 있는 곳은 '원자적' 으로 로직이 작동할 수 있도록 한다는 말인가요?

로직이 원자적으로 작동하는 것은 아니고 경합에 대한 얘기입니다.
(애당초 그렇게 큰 덩어리의 코드가 모두 원자적으로 동작할 순 없습니다.)
일반 자료구조 Container들은 멀티쓰레드 환경에 안전하게 동작하지 않습니다.
\

연결 리스트를 생각해서 예를 들어보면,
A와 B 쓰레드가 동시에 Add를 해서 데이터를 밀어 넣으면, 결과는 어떻게 되어야 할까요?
마지막 노드를 기반으로 A와 B가 각각 자신이 신규 데이터라고 우기는 상황인데
당연히 둘 중 하나는 정상적으로 삽입이 되지 않고 분실되겠죠.
따라서 애초부터 Concurrency를 염두에 두고 만든 자료구조가 아닌 이상
무조건 데이터 Write는 한 번에 한 쓰레드만 해야 합니다.

조영웅님의 프로필

조영웅

질문자

2021.03.29

제가 너무 복잡하게 생각했네요. 감사합니다!