Page 17 -
P. 17
자, 이제 메인 스레드에서는 ➋가 실행 중이고, 스레드 1이 실행 중입니다. 여러분 프로그램은 동
시에 여러 일을 하고 있습니다! ➋와 ➎ 중 어느 것이 실행이 끝나고 다음 줄로 넘어갈지는 아무
도 모릅니다. 1
메인 스레드의 ➋가 먼저 끝났다면 메인 스레드는 ➌을 실행할 차례입니다. ➌의 Join() 함수가 멀티스레딩
하는 일은 “스레드 1의 일이 모두 끝날 때까지 기다려라.”입니다. 스레드 1은 아직 ➎에 머물러 있
습니다. ➏에서 Join()을 실행하고 있는 메인 스레드는 여기서 실행을 일시 정지하고 기다립니다.
이때 우리는 “메인 스레드가 대기 중이다.”라고 표현합니다.
시간이 지나서 스레드 1의 ➎가 모두 끝났습니다. 스레드 1은 실행 지점을 ➏으로 옮깁니다. 더
이상 할 일이 없습니다. 따라서 ThreadProc()의 실행을 모두 끝내고 리턴을 하면 스레드 1은 소멸
됩니다.
그림 1-10은 스레드의 일생을 그림으로 표현한 것입니다.
그림 1-10 스레드의 일생
기다림
시작됨 Runnable Blocked
생성
(실행 중) (대기 중)
깨어남
종료
소멸
스레드를 생성하라는 함수를 실행하면 스레드가 생성되면서 여러분이 지정한 함수를 실행합니다.
즉, 스레드가 시작됩니다.
일단 시작한 스레드는 Runnable 상태, 즉 프로그램의 명령어를 실행하는 상태로 바뀝니다. 그러
다가 다른 무언가를 기다릴 때는 Blocked 상태가 됩니다. 이때는 스레드가 일시 정지 상태입니다.
이후 기다리고 있던 무언가에서 무슨 일이 생기면, 스레드는 기다림을 끝내고 다음 명령을 마저
실행합니다. 즉, Runnable로 돌아옵니다. 모든 일을 다 마치면 스레드는 Dead 상태가 되어 소멸
됩니다.
스레드 1의 ➎가 먼저 끝났다면 어떻게 될까요? ThreadProc()은 리턴하고 스레드 1은 소멸할 것
입니다. 메인 스레드는 아직 실행 지점 ➋에 머물러 있습니다. 조금 뒤 ➋가 끝나고 ➌의 Join()
을 실행합니다. 그런데 이미 스레드 1은 일이 다 끝나고 종료되었습니다. 이때 ➌의 Join()은 ‘기
다리려고 했는데 이미 다 끝났음’을 알게 되어, 기다리는 과정으로 갈 필요 없이 바로 ➍로 넘어갑
025