동기화란 작업이 병렬로 진행 될 때 각 실행 작업의 시점을 일치시키는 것을 말한다. 특히 여러 쓰레드가 동일한 자원(데이터)에 접근 시 동기화 이슈가 발생하며 동일 자원을 동시 수정 시 각 쓰레드 결과에 영향을 준다.
다음 파이썬 코드를 보면 쓰레드를 50개 생성하여 1,000,000을 더해 총 합을 마지막에 구하도록 하는 작업인데 50,000,000이 나와야됨에도 불구하고 훨씬 적은 값이 나오는 것을 확인할 수 있다. 이를 동기화 이슈가 발생한 것으로 볼 수 있다.
g_count = g_count + 1
위의 코드 상으로는 한줄일지라도 내부를 들여다 보면 다음과 같이 3가지 작업으로 분리되어 있다. 읽고 / 연산하고 / 저장하는 과정이다.
하지만 쓰레드도 컨텍스트 스위칭을 통해 각 작업이 중단되는 일이 발생하는데 하필 연산이 진행 후 저장 직전에 넘어가고 저장되지 않는 값을 불러와 다음 쓰레드가 일을 처리하고 저장하는 식의 과정이 반복되며 누락되는 연산이 생겨난다.
따라서 위와 같은 불상사를 방지하기 위해서는 공유 변수에 대해 Exclusive Access가 필요하다. 어느 한 쓰레드가 공유 변수를 갱신하는 동안은 접근하지 못하도록 막는 것이다. 다음에서 threading 라이브러리 내에 Lock 클래스에 있는 acquire/release 함수를 통해 갱신 중 타 쓰레드 작업을 막는다.
이 때 공유되는 자원을 임계 자원(critical resource), 해당 구간을 임계 영역(critical section)이라고 한다.