Multi-Thread(이하 MT) 응용프로그램을 개발한다는 것은 컴퓨터 자원을 최대한 활용하여 성능을 높인다는 면에서 좋은 일이지만 개발자가 절대 간과해서 안되는 것이 하나 있습니다. 바로 MT간의 데이터 공유 문제입니다. 간단히 생각해 봐도 문제가 생길 여지가 많음을 쉽게 떠올릴 수 있습니다. 예를 들어 10개 정도의 Thread가 동시에 하나의 공유(전역으로 선언된 static 같은...) 변수를 조작한다고 할 때 그 값의 변화들이 개발자가 예상하는 대로 나와줄까요.
아래 코드예를 보세요.
아래는 실행결과입니다.
위의 코드에서 count 값을 1 증가시키는 연산명령이 컴퓨터상에서 물리적으로 처리되는 과정을 나열해 보면 아래와 같습니다.
1. 메모리에 있는 count의 현재값을 프로세서의 레지스터(register)로 읽어들인다.
2. 레지스터에 읽어들인 그 값을 1만큼 증가시킨다.
3. 레지스터에서 변경된 그 값을 메모리로 복사한다.
위 처리 절차 자체로는 아무 문제가 없습니다. 원래 CPU 역할이 그거니까. 문제는 프로세서가 여러개인 경우 또는 Hyper Threading(하나지만 CPU가 여러개인 것처럼 연산을 동시에 할 수 있는)을 지원하는 CPU인 경우에는 MT하에서는 아래와 같은 문제가 발생할 수 있습니다.