← 질문 목록
#211깊이 0
경쟁 상태를 막으려면 무엇을 고려해야 하는가?
공유 자원에 접근하는 순서가 결과에 영향을 주는 상황을 제어해야 한다. 원자적 연산으로 처리하거나 상호 배제 기법을 사용한다.
| 순서 | 스레드 A | 스레드 B |
|---|---|---|
| 1 | 잔액 100을 읽는다 | 아무것도 하지 않습니다 |
| 2 | 아무것도 하지 않습니다 | 잔액 100을 읽는다 |
| 3 | 150을 쓴다 | 아무것도 하지 않습니다 |
| 4 | 아무것도 하지 않습니다 | 130을 쓴다 |
스레드 B가 A의 150을 130으로 덮어써 50이 사라진다. 둘 다 100을 읽은 뒤에 각자 계산했기 때문에 A가 더한 50이 사라진다. 그래서 임계 구역에 들어가기 전에 락을 걸어 다른 스레드의 진입을 막는다.
다만 락의 범위가 넓으면 성능이 떨어진다. 꼭 필요한 구간만 묶거나, 원자적 변수처럼 하드웨어 수준의 명령어를 사용해 오버헤드를 줄여야 한다.