멀티코어와 동기화
위 코드에서 스레드 1이 data를 준비한 뒤 flag로 알리고, 스레드 2가 flag를 확인한 뒤 data를 읽는다. 약한 메모리 일관성 모델의 CPU에서 스레드 2가 확실히 42를 읽기 위해 필요한 것으로 올바른 것은?
// 스레드 1 // 스레드 2
data = 42; while (flag == 0) { }
flag = 1; print(data);
- Adata의 타입을 int에서 long으로 바꾼다
- Bflag에 대한 쓰기를 release로, flag의 읽기를 acquire로 하여 순서를 보장한다
- C스레드 2의 루프 안에 아무것도 쓰지 않는다
정답과 해설 보기
정답: B. flag에 대한 쓰기를 release로, flag의 읽기를 acquire로 하여 순서를 보장한다
약한 모델에서는 스레드 1의 두 쓰기가 뒤바뀌어 보이거나, 스레드 2의 data 읽기가 flag 읽기보다 먼저 수행될 가능성이 있어, flag가 1인데도 data가 오래된 값 그대로인 일이 일어날 수 있습니다. flag에 대한 쓰기를 release로 하면 그 이전의 쓰기가 먼저 보이는 것이 보장되고, flag의 읽기를 acquire로 하면 그 이후의 읽기가 앞질러 수행되지 않게 됩니다.
- A. 타입을 바꿔도 순서는 보장되지 않습니다.
- B. 맞습니다. data의 쓰기가 flag보다 먼저 보이는 것이 보장됩니다.
- C. 루프의 내용은 순서 보장과 관계없습니다.