스레드를 여러 개 두면, 각 스레드는 서로 다른 cpu에서 동시에 돌아갈 수 있게 되므로 parallel한 프로그램 실행이 가능하다. 한마디로, 더 빨리 프로그램을 돌릴 수 있다는 것이다.
하지만 문제가 있다. 여러 스레드는 하나의 process address space를 공유하기 때문에, 서로 다른 스레드가 같은 메모리 영역에 접근하려 할 수 있다!
예를 들어, x = x + 1 이라는 instruction을 두 개의 스레드가 실행한다고 해보자.
첫 스레드는 메모리에서 x를 가져와서 레지스터에 옮기고, 레지스터에서 1 증가시키는 작업까지 했다. 그리고 다시 x에 레지스터 값을 load 하기 전에 timer interrupt가 걸려서 다른 스레드가 스케줄링 되었다. 다른 스레드 역시 마찬가지로 x에서 레지스터로 값을 옮길 것이다. 이때 이전 스레드가 다시 메모리에 1 증가된 값을 로드하지 않았기에, 여전히 예전 x값을 가져오게 될 것이다. 따라서 두 스레드가 종료하면 x는 2가 아닌 1이 증가하게 된다.
즉, x = x + 1 이라는 operaiton이 atomic 하지 않아서, timer interrupt가 걸리는 시점에 따라서 그 결과가 달라질 수 있고, 값이 보장되지 않는다는 것이다.
이 race condition이 일어날 수 있는 부분을 critical section이라고 한다. 한 번에 하나의 스레드만 접근할 수 있는 부분인 것이다.
따라서 우리는 이 critical section에 lock이라는 것을 걸어, lock을 갖고 있는 스레드만 접근할 수 있도록 한다.