해결된 질문
작성
·
398
·
수정됨
0
데드락 강의에서
"Lock을 통해 원자성을 구현하는 것인가요?"
라는 질문에 아래처럼 답변하신 글을 보았습니다.
Lock은 말 그대로 신호등처럼 순차적으로 접근하기 위한 도구이지.어떤 연산이 원자적으로 이루어진다는 보장을 하는 것은 아닙니다.
이번 강의에서는
한가지 더 궁금한게, 의사코드로 설명해주실때, 이게 3줄이라서 이 사이에 끼어든거다라는 늬앙스로 처음에는 이해를 했거든요. 그런데 지금 설명을 들어보니까 몇줄이건 관계없이 CPU에서 locked계열 명령어가 적용되면 해당 부분은 원자성이 보장되는건가요?
라는 질문에는 그렇습니다. 말 그대로 특수한 명령어이죠. 라고하신걸 보고 헷갈려서 질문 드립니다.
Q. 데드락 강의 실습처럼 제가 직접 lock()으로 임계 영역을 감싸서 구현하는 것은 해당 영역의 연산들이 원자적으로 이루어진다는 것을 보장받을 수 없고
Interlocked 클래스 같이 마련된 것을 사용하여 임계 영역을 관리하면 해당 영역의 연산들은 원자성이 보장되는 것인가요?
답변 2
1
네 지금 보니 질문 의도에 따라 답변이 조금 헷갈릴 수 있는데,
int count; 라는 변수가 있을 때
count++은 한 번에 이루어지지 않고,
사실상
int temp = count;
temp = temp + 1;
count = temp:
와 같은 3단계로 CPU가 처리를 합니다.
그래서 멀티쓰레드 환경에서도 문제가 일어나구요.
이럴 때 lock ()으로 감싸줘서 count++를 하면,
여전히 3 단계로 이루어지는 것은 변함이 없으나,
다른 쓰레드 접근을 차단해서 멀티쓰레드 이슈는 해결됩니다.
답변의 요지는 "한번에 연산이 일어나는 것"을 해결하는 것은 아니라는 의미였습니다.
그런데 지금 설명을 들어보니까 몇줄이건 관계없이 CPU에서 locked계열 명령어가 적용되면 해당 부분은 원자성이 보장되는건가요?
이건 Interlocked 계열의 함수라고 잘못 보고 답변을 드렸네요
1
안녕하세요, 인프런 AI 인턴입니다.
황주은님께서 Interlocked 클래스를 사용할 때 원자성이 보장되는지에 대해 궁금해 하셨군요. 질문의 핵심은 lock()
스테이트먼트와 Interlocked
클래스를 이용한 연산에서 원자성이 어떻게 다르게 작동하는지에 대한 이해입니다.
주요 내용을 아래와 같이 요약해보겠습니다:
- lock()
은 임계영역(critical section)에 단 하나의 스레드만이 접근할 수 있도록 순차적으로 제어하는 역할을 합니다. 그러나 lock()
내부의 연산들이 하나의 원자적 단위로 실행되는 것은 아닙니다.
- Interlocked
클래스의 메서드들은 원자성을 보장하는 특수한 CPU 연산에 대응되어, 해당 메서드를 통해 수행되는 작업은 멀티스레딩 환경에서도 동시에 실행되는 것을 방지하는 원자적 연산으로 처리됩니다.
이와 관련하여 유사한 질문이 있어서 그 답변 내용을 첨부하겠습니다.
Interlocked
클래스 관련 질문에 대한 답변을 찾아볼 수 있습니다. CPU 차원의 locked 계열 특수 명령어를 통해 다중 스레드 환경에서 단일 연산이 보장되는 방식에 대한 설명이 있어 도움이 될 것입니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
빠른 답변 감사합니다 강사님!!
그렇다면 첫 질문에서 어떤 연산이 원자적으로 이루어진다는 보장이 없다고 하신게 lock으로 감싸도 결국 어셈블리 단계에서는 해당 연산이 똑같이 3단계로 이루어진 것이어서 그렇고
Interlocked 계열의 명령어가 적용되면 어셈블리어단계(?라고 말하는게 맞는지 모르겠지만) 거기 자체에서 원자적으로 연산이 되는 명령어를 통해서 실행되는 거라 원자성 보장이 된다고 하셨구나. 라고 이해하면 맞는걸까요?