멀티코어와 동기화
조건 변수(condition variable)로 「큐가 비어 있지 않게 될 때까지 기다린다」고 할 때, 대기에서 깨어난 뒤 조건을 if문이 아니라 while문으로 다시 확인하는 이유로 올바른 것은?
- Awhile문이 if문보다 실행이 빠르기 때문
- Bif문에서는 조건 변수를 사용할 수 없는 규칙이기 때문
- C깨워졌더라도 다른 스레드가 먼저 가져가 버렸거나, 이유 없이 깨어났을 수 있어 조건이 만족되지 않았을 가능성이 있기 때문
정답과 해설 보기
정답: C. 깨워졌더라도 다른 스레드가 먼저 가져가 버렸거나, 이유 없이 깨어났을 수 있어 조건이 만족되지 않았을 가능성이 있기 때문
조건 변수의 대기는 락을 놓고 잠든 뒤, 신호를 받아 깨어나면 락을 다시 잡고 돌아옵니다. 그러나 깨어나기까지의 사이에 다른 스레드가 먼저 락을 잡고 큐의 요소를 가져가 버리는 일이 있습니다. 또한 구현상의 사정으로 신호가 없어도 깨어나는 것(spurious wakeup, 가짜 기상)이 허용되어 있습니다. 그래서 깨어난 뒤 조건을 확인하고, 만족되지 않았으면 다시 기다리는 while문으로 작성합니다.
- A. 속도의 문제가 아닙니다.
- B. 그런 규칙은 없습니다.
- C. 맞습니다. 깨어난 뒤에 조건을 다시 확인해야 합니다.