[완료] 멀티스레드 프로그래밍시, data race 현상 질문입니다.
글쓴이: nockol / 작성시간: 토, 2009/06/06 - 10:17오후
다음과 같이, 하나의 데이터에 대해 어떤 문제가 생기는지요?
첫번째 경우: A 스레드가 쓰기 작업을 함과 '동시에', B 스레드가 읽기 작업을 할 때.
1. 쓰고있던 상태에서 읽었으므로, 쓰레기 값을 읽어들인다.
2. (반드시) 쓰기 전 값 또는, 쓴 후의 값을 읽어들인다. 즉, 적어도 오류는 생기지 않는다.
두번째 경우: A 스레드가 쓰기 작업을 함과 '동시에', B 스레드도 쓰기 작업을 할 때.
1. 동시에 값을 쓰게 되므로, 값이 깨져서 쓰레기 값으로 기록된다.
2. (반드시) 어느 값이건, 한 쪽의 스레드가 썼던 값이 기록된다. 즉, 적어도 오류는 생기지 않는다.
만약, 두 경우 모두 2번이 '반드시' 보장된다면, lock 작업이 많이 줄어들 것 같아서, 어떨지 정말 궁금하네요.
Forums:
현재 값이 읽히겠죠
공용 데이타의 관리가 멀티 쓰레드 프로그램의 핵심인데,
저렇게 함부로 읽고 쓰게 해서는 프로그램이 돌아가질 않죠.
일단 공용 데이타는 읽기 전용으로 하는 것이 최선이고
어쩔 수 없는 경우에만 lock 을 하거나 일부 함수형 언어에서는 STM 을 사용한 간접 접근 방식을 사용합니다.
답변 잘 읽었습니다 그런데...
물론, 공용 데이터에 대해서는 lock이 중요합니다만, 제가 정말로 궁금한 점은,
저런 두가지 경우, 어떤 결과가 나오는가 입니다. :)
멀티쓰레드 환경이라
멀티쓰레드 환경이라 해도 동일 주소의 메모리 접근은 순차적으로 일어나기 때문에 나중 값이 덮어쓰게 됩니다.
그렇군요. 그렇다면...
싱글 프로세서(또는 코어)가 아닌, 멀티 프로세서(또는 코어)인 경우도 100% 동시에 메모리 접근은 일어나지 않는건가요?
캐시 땜에 문제가
캐시 땜에 문제가 복잡해 질 수 있는데,
A 코어가 메모리에 쓰고 다시 B 코어가 메모리 쓰기를 한 후에 A 코어 캐시의 갱신이 이루어 지지 않은 상태에서 A 코어가 일기를 시도한다면 잘못된 데이타가 읽힐 수도 있겠습니다.
음 역시
낮은 확률이더라도, 잘못된 데이터(쓰레기 값이겠죠?)가 읽힐수도 있다는거군요...
답변 감사합니다. :)
댓글 달기