여러개의 쓰레드에서 전역변수 참조하는 경우 충돌이 일어나지 않을까요 ?
글쓴이: ljh0431 / 작성시간: 토, 2010/02/06 - 2:43오후
지역변수가 아닌 전역변수(가령 char data[1024])가 있을 경우,
여러 쓰레드에서 이 전역변수를 참조할 경우(reading만 할 경우),
충돌이 일어나지는 않을 까요 ?
제가 우려하는 부분은 멀티코어 또는 멀티프로세서의 경우 2개이상의 쓰레드가 동시에
이 전역변수를 참조할 경우 시스템 에러가 발생하는지입니다.
이 부분이 걱정이 되네요.
물론 동기화를 맞쳐주면 되는데, reading만 구현함으로 이 부분이 필요없지
않은가 싶어서요.
이 부분이 궁금하군요.
Forums:
reading만 한다면 문제
reading만 한다면 문제 될 건 없습니다. read-write, write-read sequence problem도 없고, race condition도 없습니다. 그리고 아마도 저 프로세스가 돌아갈때는 저 영역의 메모리는 건드리지도 않고 캐쉬만 주구장창 읽을 가능성도 매우 클껍니다.
char data[1024] 같은
char data[1024] 같은 경우엔 락없이 쓸 경우에 예상하지 못한 값을 읽어올 수 있습니다. 아키텍쳐마다 다르지만 메모리 엑세스의 atomicity는 얼라인되어있는 주소의 크기(sizeof(void *))까지만 보장된다고 생각하는 게 안전합니다. 그 범위 밖으로 나가거나 스트링 오퍼레이션을 사용하는 경우 바뀌기 전 후 값들이 섞여서 읽힐 수 있습니다. 즉,
long long a = 1;
long long b;
thread 1
a = 0;
thread 2
b = a;
b가 1이나 0이 아닐 수도 있습니다.
====
엇, reading만 한다면을 빼고 읽고선 답글을 썼습니다;;; 네, 읽기만 할 때는 아무 문제 없습니다.
reading
원글님은 reading만을 말씀하시는 듯 하네요.
댓글 달기