해결된 질문
작성
·
50
0
Interlocked 강의 부분에서 전역 변수 number = 0에 대해
Thread 1은 for문으로 number++
Thread 2는 for문으로 number--
여기서 Thread 두 개가 race condition으로 인해 반복횟수가 많아지면 number를 가져오고, 연산하고 대입하는 과정에서 원자성이 보장되지 않아 number가 변한다고 설명하셨는데요.
오히려 그러면 for문에서 1만번의 반복 과정에서는 number = 0 으로 제대로 나타났는데, 그게 이해가 되지 않습니다. 반복 과정에서도 각 Thread가 race condition이기 때문에 number가 변동할 것 같은데, 제 컴퓨터로 돌려봐도 어느정도 연산량이 적으면 number = 0으로, 이상하게 올바르네요.
이유가 무엇일까요? Thread 2가 실행되기 전에, 컴퓨터의 연산이 빨라서 Thread 1에서 number를 1만번 ++의 계산이 끝나는 걸까요?
답변 2
1
이유가 무엇일까요? Thread 2가 실행되기 전에, 컴퓨터의 연산이 빨라서 Thread 1에서 number를 1만번 ++의 계산이 끝나는 걸까요?
-> 네 그렇습니다. 공평하게(?) 테스트 하려면 flag 하나를 두고 둘 다 켜졌을 때 일감을 실행하도록 해야겠죠. 그리고 1만번 정도라면 애당초 컴퓨터 관점에선 아주 순식간에 일어나는, 횟수가 적은 일감이라 <운 좋게> 문제 상황이 일어나지 않는 수도 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. Rein님.
Race condition과 관련된 질문에 대해 설명드리기 전에, 아래의 유사한 질문과 답변을 참고해 보시면 도움이 될 것 같습니다:
멀티쓰레드 관련 질문입니다.
Interlocked와 race condition에 대한 자세한 설명이 포함되어 있습니다. 특히, 멀티쓰레딩 환경에서의 Interlocked 사용과 race condition의 발생 이유에 대해 다루고 있습니다.
SpinLock 강의 중 이해가 안되는 부분이 있어 질문드립니다.
이 질문에서는 SpinLock
과 관련한 race condition에 대해 다루며, 왜 예상치 않은 값이 나올 수 있는지 설명하고 있습니다.
number의 값이 이상한 상수로 나오는 현상이 발생합니다
동일한 시나리오에서 발생할 수 있는 다양한 상황과 해결 방법에 대해 논의하고 있습니다.
Interlocked를 사용하지 않고 단순히 다중 쓰레드로 number를 증가/감소시키면, 다음과 같은 이유로 0이 되도록 보장되지 않을 수 있습니다:
연산의 원자성 부족: number++와 number–는 각각 세 부분으로 나뉠 수 있습니다(값 읽기, 증가/감소, 값 쓰기). 이들 연산이 원자성을 가지지 않기 때문에, 연산 중간에 다른 쓰레드가 끼어들면서 예상치 못한 값을 저장할 수 있습니다.
경험적 결과의 확률성: 여러 번 반복하여 테스트하다 보면 운 좋게도 두 쓰레드가 완벽히 교차하여 number가 0이 되는 경우가 생길 수 있습니다. 그러나 이는 보장된 결과가 아닙니다.
쓰레드 간의 경합으로 인해 예기치 않은 결과가 나올 수 있지만, 컴퓨터의 연산 속도가 빠르면 단기적으로 예상된 결과가 나올 수도 있습니다. 그러나 장기적으로나 반복 횟수가 많아질 경우, 원자성이 보장되지 않으면 특정한 패턴을 기대하는 것은 위험합니다. Interlocked를 사용하여 이러한 경합을 방지하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.