Thread에서 이상한점
쓰레드에 관해서 이상한 점이 있어서 이렇게 질문을 하게되었습니다.
우선 코드를 보시고
void *Thread(void *obj)
{
pthread_t tid = pthread_self();
pid_t pid = getpid();
printf("pid -%d tid - %d\n", tid, pid);
while(1);
return (void *)1;
}
int main()
{
pthread_t threadID;
pthread_create(&threadID, NULL , Thread, NULL);
pthread_t tid = pthread_self();
pid_t pid = getpid();
printf("pid -%d tid - %d\n", tid, pid);
while(1);
return 1;
}
이 프로그램을 실행시, 제가 공부한 책(APE 2판외 각종 유닉스, 리눅스 관련서적들)에 의하면 두개에 쓰레드가 돌고 있어야합니다. 메인쓰레드와 그 메인쓰레드에서 만들어진 Thread()함수의 쓰레드입니다. 그러나 제가 ps로 확인해본 결과 3개의 프로세스가 돌아가고 있더군요. 메인쓰레드와 Thread()함수로 돌아가는 쓰레드 사이에 하나가 끼워져 있더군요. 이 관계는 부모프로세스 값으로 확인한 겁니다. 그럼 그 중간의 끼워져 있는 쓰레드의 존재가 궁금해집니다. 그리고, Thread()함수에서 while(1)을 제거하면 그 쓰레드는 zombie상태가 되어서 그 부모쓰레드가 pthread_join으로 리소스를 해제해야 된다고 책에 나와있는데, 그냥 없어져 버려서 pthread_join같은게 필요없어집니다. 그리고 그때에 중간에 끼워져 있는 쓰레드는 사라지지도 않습니다. 이런부분에 대해선 책에 없으니 답답하네요, 예제도 초간단한건데, 원래 그런것인지, 책이 잘못된건지, 제가 잘못된건지 알고 싶습니다.
1. 추가 thread single thread 프로그램으로 돌리더라
1. 추가 thread
single thread 프로그램으로 돌리더라도 몇개의 thread가 생성될 수 있습니다.
이건 OS에서 자체적으로 만들어 내는 thread로 System call 처리등 다양한 용도로 사용될 수 있습니다.
OS가 만들어 내는 것이니 무시 하셔도 됩니다.
2. 좀비 thread
pthread 표준에서 join을 해서 해제를 하지 않았을 때의 행동은 undefined일 것입니다.
ps로 thread가 남아있는것이 확이되어야 한다고 규정되어 있는 것은 아니지요.
보통 이런경우에 대한 처리는 각 OS의 구현 방법에 따라서 달라지는데 join으로 종료를 처리해 주지 않아도 크게 문제되지 않습니다.
일부 자원이 해제 되지 않을 수 있지만 큰 용량이 아니기 때문입니다.
물론 thread가 지속적으로 생성되었다 파괴되어야 하는 환경이라면 큰 문제가 되겠지만 주로 thread pool구조를 사용하기 때문에 정리하지 않아도 큰 문제는 없습니다.
댓글 달기