멀티코어와 동기화

위 코드를 두 스레드에서 동시에 실행하면 counter의 최종 값이 200000보다 작아지는 경우가 있다. 그 이유로 올바른 것은?

int counter = 0;
// 두 스레드가 동시에, 각각
for (int i = 0; i < 100000; i++)
    counter++;
  1. ACPU가 덧셈 계산을 틀리는 경우가 있기 때문
  2. Bcounter++는 읽기·덧셈·쓰기로 나뉘며, 두 스레드의 처리가 겹치면 한쪽의 덧셈이 사라지기 때문
  3. C루프 횟수가 스레드마다 자동으로 절반이 되기 때문
정답과 해설 보기

정답: B. counter++는 읽기·덧셈·쓰기로 나뉘며, 두 스레드의 처리가 겹치면 한쪽의 덧셈이 사라지기 때문

counter++는 메모리에서 값을 읽고, 1을 더하고, 메모리에 다시 쓰는 세 가지 동작입니다. 스레드 A가 100을 읽고 쓰기 전에 스레드 B도 100을 읽으면, 둘 다 101을 쓰게 되어 두 번의 덧셈이 한 번의 덧셈이 되어 버립니다. 이것은 데이터 레이스의 전형적인 예입니다. 아토믹 덧셈 명령을 사용하거나 락으로 한 번에 하나의 스레드만 갱신하도록 하면 올바르게 200000이 됩니다.

  • A. CPU의 계산은 올바르게 수행되고 있습니다.
  • B. 맞습니다. 같은 오래된 값에 1을 더해 같은 값을 쓰게 됩니다.
  • C. 루프 횟수는 변하지 않습니다.
이 분야 연습하기 분야로 돌아가기

멀티코어와 동기화의 다른 문제

  1. 아토믹 명령(atomic instruction, 불가분 명령)에 대한 설명으로 올바른 것은?
  2. 아토믹 명령 CAS(compare-and-swap)의 동작으로 올바른 것은?
  3. 위 코드는 CAS(&p, 기대값, 새 값)를 사용하여 공유 변수 counter를 2배로 만들고 있다. CAS가 실패하여 루프를 다시 도는 경우는 언제인가?
  4. RISC-V의 LR/SC(load-reserved/store-conditional)와 같은 명령 쌍에서, SC(조건부 스토어)가 실패하는 경우는 언제인가?
  5. CAS를 사용한 락프리 자료구조에서 문제가 되는 ABA 문제에 대한 설명으로 올바른 것은?

이 분야의 비교