인프런 커뮤니티 질문&답변
JobQueue #1 12:40 초
해결된 질문
작성
·
323
답변 1
1
Rookiss
지식공유자
말 그대로입니다!
JobQueue를 Pop하고 실행하는 애가 있다고 하더라도,
해당 JobQueue를 외부에서 접근하지 못하는 것은 아닙니다.
멀티쓰레드 특성상 다른 쓰레드들은 독립적으로 실행되기 때문에,
다른 쓰레드가 클라 요청을 받아서
작업중인 JobQueue에 다른 일감을 Push할 수도 있습니다.
따라서 나만 Flush한다고 안심한다고 그냥 Pop하면 안되고
lock을 걸어서 안전하게 데이터를 꺼내야 합니다.
Rookiss
지식공유자
로직이 원자적으로 작동하는 것은 아니고 경합에 대한 얘기입니다.
(애당초 그렇게 큰 덩어리의 코드가 모두 원자적으로 동작할 순 없습니다.)
일반 자료구조 Container들은 멀티쓰레드 환경에 안전하게 동작하지 않습니다.\
연결 리스트를 생각해서 예를 들어보면,
A와 B 쓰레드가 동시에 Add를 해서 데이터를 밀어 넣으면, 결과는 어떻게 되어야 할까요?
마지막 노드를 기반으로 A와 B가 각각 자신이 신규 데이터라고 우기는 상황인데
당연히 둘 중 하나는 정상적으로 삽입이 되지 않고 분실되겠죠.
따라서 애초부터 Concurrency를 염두에 두고 만든 자료구조가 아닌 이상
무조건 데이터 Write는 한 번에 한 쓰레드만 해야 합니다.






lock 부분을 다시 복습해 보니,
말씀하신대로 'Lock을 걸어서 안전하게 데이터를 꺼내야 한다' 라는 말이
멀티스레드에서 생기는 '경합 조건', '메모리 베리어 가시성' 같은 문제를 방지하기 위해
여러 스레드가 동시에 접근할 수 있는 곳은 '원자적' 으로 로직이 작동할 수 있도록 한다는 말인가요?