경쟁 조건은 공유 쓰기와 끼어들기에서 시작된다
count++처럼 한 줄로 보이는 코드도 읽기, 수정, 쓰기로 나뉩니다. 같은 값을 여러 실행 흐름이 바꾸고 중간에 끼어들 수 있으면 동기화 문제가 됩니다.| 질문 | 확인 기준 | 위험 신호 | 보호 방향 |
|---|---|---|---|
| share | 같은 데이터나 장치를 함께 보는가 | 전역 변수, heap 객체, file descriptor | 소유권 분리 또는 접근 규칙 명시 |
| write | 하나 이상의 흐름이 값을 바꾸는가 | 읽기와 쓰기가 섞인 누적 연산 | 원자 연산 또는 임계 영역 |
| interleave | 중간 상태에 다른 흐름이 들어올 수 있는가 | 체크 후 사용, read-modify-write | 검사와 수정을 한 구간으로 묶기 |
| protect | 보호 규칙이 모든 경로에 적용되는가 | 일부 함수만 lock을 잡는 구조 | 공통 API, lock order, sanitizer |
mutual exclusion
같은 임계 영역은 동시에 통과하지 못해야 합니다.
progress
비어 있는데도 아무도 못 들어가는 설계는 실패입니다.
bounded waiting
특정 흐름이 계속 밀려나는 기아를 막아야 합니다.
tools
ThreadSanitizer와 Helgrind로 실제 경합 지점을 찾습니다.