멀티스레드 코드를 처음 짜보는데 레이스 컨디션이랑 데드락, 이 두 용어가 계속 섞여서 헷갈립니다. 둘 다 스레드 여러 개 돌릴 때 생기는 문제라는 것까지는 아는데 정확히 뭐가 다른 건지 구분이 안 돼요.
제가 이해한 예시를 적어볼게요.
// 상황 1: 여러 스레드가 동기화 없이
counter++; // 값이 가끔 유실됨
// 상황 2
스레드 A: lock(A) 잡고 lock(B) 기다림
스레드 B: lock(B) 잡고 lock(A) 기다림
// 둘 다 영원히 멈춤
상황 1은 counter++가 사실 읽고-더하고-쓰는 여러 단계라서 겹치면 값이 날아간다고 들었는데 이게 레이스 컨디션 맞나요? 상황 2는 서로 상대가 가진 락을 기다려서 아무도 진행 못 하는 데드락이고요.
둘의 근본적인 차이가 뭔지, 그리고 각각 어떻게 예방하는지(원자적 연산이나 락 순서 같은 얘기를 봤어요) 정리해서 알려주시면 감사하겠습니다.