멀티코어와 동기화
위 코드를 두 스레드에서 동시에 실행하면 counter의 최종 값이 200000보다 작아지는 경우가 있다. 그 이유로 올바른 것은?
int counter = 0;
// 두 스레드가 동시에, 각각
for (int i = 0; i < 100000; i++)
counter++;
- ACPU가 덧셈 계산을 틀리는 경우가 있기 때문
- Bcounter++는 읽기·덧셈·쓰기로 나뉘며, 두 스레드의 처리가 겹치면 한쪽의 덧셈이 사라지기 때문
- C루프 횟수가 스레드마다 자동으로 절반이 되기 때문
정답과 해설 보기
정답: B. counter++는 읽기·덧셈·쓰기로 나뉘며, 두 스레드의 처리가 겹치면 한쪽의 덧셈이 사라지기 때문
counter++는 메모리에서 값을 읽고, 1을 더하고, 메모리에 다시 쓰는 세 가지 동작입니다. 스레드 A가 100을 읽고 쓰기 전에 스레드 B도 100을 읽으면, 둘 다 101을 쓰게 되어 두 번의 덧셈이 한 번의 덧셈이 되어 버립니다. 이것은 데이터 레이스의 전형적인 예입니다. 아토믹 덧셈 명령을 사용하거나 락으로 한 번에 하나의 스레드만 갱신하도록 하면 올바르게 200000이 됩니다.
- A. CPU의 계산은 올바르게 수행되고 있습니다.
- B. 맞습니다. 같은 오래된 값에 1을 더해 같은 값을 쓰게 됩니다.
- C. 루프 횟수는 변하지 않습니다.