가시성: 각 코어들은 캐시를 가지고 있는데, 공유 변수의 값을 메모리에 저장 안하고 자기 캐시에만 저장해놓았을 수도 있고, 각 캐시마다 변수의 값이 다르게 저장되있을 수도 있음.
코드 재배치: cpu나 컴파일러의 최적화 이슈로 코드가 재배치됨. fetch -> decode -> execute -> write back
각각 데이터 가져오기, 데이터 해석, 실행, 저장을 의미한다.
int x = 0; int y = 0; int r1 = 0; int r2 = 0;일 때,
쓰레드 1이
x = 1;
r2 = y;를 실행하고,
쓰레드 2가
y = 1;
r1 = x;를 실행할 때, 계속 실행하다보면 x = 0과 y = 0이 결과값으로 나올 수 있다. (가시성과 코드 재배치의 이슈)
쓰레드 1에서 x는 1이지만, 자기 캐시에만 저장해놓고, 쓰레드 2의 x는 메모리나 자기 캐시에 있는 0을 가져온다면 두 값이 달라짐.
또 최적화 이슈로
x = 1;
r2 = y;
가
r2 = y;
x = 1;
로 순서가 바뀔수도 있음. 바꿔도 싱글쓰레드 환경에서는 결과가 달라지지 않기 때문 또한 cpu나 컴파일러 입장에서 저렇게 코드 재배치를 하는 것이 더 효율적이라고 생각하기 때문.
'MMOServer' 카테고리의 다른 글
DeadLock 탐지(C++) (0) | 2025.03.20 |
---|---|
Read-Write Lock(C++) (0) | 2025.03.19 |
Future(C++) (0) | 2025.03.13 |
Event, Condition_Variable(C++) (0) | 2025.03.13 |
SpinLock(C++) (0) | 2025.03.13 |