더북(TheBook)

스레드를 생성하라는 함수를 실행하면 스레드가 생성되면서 여러분이 지정한 함수를 실행합니다. 즉, 스레드가 시작됩니다.

일단 시작한 스레드는 Runnable 상태, 즉 프로그램의 명령어를 실행하는 상태로 바뀝니다. 그러다가 다른 무언가를 기다릴 때는 Blocked 상태가 됩니다. 이때는 스레드가 일시 정지 상태입니다. 이후 기다리고 있던 무언가에서 무슨 일이 생기면, 스레드는 기다림을 끝내고 다음 명령을 마저 실행합니다. 즉, Runnable로 돌아옵니다. 모든 일을 다 마치면 스레드는 Dead 상태가 되어 소멸됩니다.

스레드 1의 가 먼저 끝났다면 어떻게 될까요? ThreadProc()은 리턴하고 스레드 1은 소멸할 것입니다. 메인 스레드는 아직 실행 지점 에 머물러 있습니다. 조금 뒤 가 끝나고 Join()을 실행합니다. 그런데 이미 스레드 1은 일이 다 끝나고 종료되었습니다. 이때 Join()은 ‘기다리려고 했는데 이미 다 끝났음’을 알게 되어, 기다리는 과정으로 갈 필요 없이 바로 로 넘어갑니다. 이후로는 할 일이 없으므로 메인 스레드는 종료합니다.

결국 실행된 프로세스 안의 모든 스레드가 종료되었으므로 프로세스 자체가 종료합니다.

메인 스레드가 먼저 종료되면 어떻게 될까요? 메인 스레드가 이미 종료되었지만, 다른 스레드가 아직 뭔가를 하고 있습니다. 따라서 프로세스는 종료하지 않고 계속 남아 있습니다. 멀티스레드 프로그램을 개발할 때 주의할 점은 바로 이것입니다. 메인 스레드가 종료되었지만 다른 스레드를 그냥 남겨 둔다면, 프로그램이 종료되지 않는 한 이상한 현상을 겪게 될 것입니다. 이를 좀비 프로세스라고도 합니다.

스레드를 생성하는 함수는 운영체제마다 다르고 프로그래밍 언어마다 다릅니다. 여기서는 자주 사용하는 것 위주로 소개하겠습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.