메인 스레드가 종료되면 다른 스레드도 종료됩니까?
같은 과정에서 메인 쓰레드와 다른 쓰레드에 문제가 있습니다.메인 기능이 돌아오면 다른 스레드도 종료됩니까?저는 이것에 대해 혼란스럽습니다.
다음 테스트 코드를 고려합니다.
void* test1(void *arg)
{
unsigned int i = 0;
while (1){
i+=1;
}
return NULL;
}
void* test2(void *arg)
{
long double i = 1.0;
while (1){
i *= 1.1;
}
return NULL;
}
void startThread ( void * (*run)(void*), void *arg) {
pthread_t t;
pthread_attr_t attr;
if (pthread_attr_init(&attr) != 0
|| pthread_create(&t, &attr, run, arg) != 0
|| pthread_attr_destroy(&attr) != 0
|| pthread_detach(t) != 0) {
printf("Unable to launch a thread\n");
exit(1);
}
}
int main()
{
startThread(test1, NULL);
startThread(test2, NULL);
sleep(4);
printf("main thread return.\n");
return 0;
}
"메인 스레드 리턴"이 출력되면 스레드 test1 및 test2도 ,을 종료합니다. 이유를 알려줄 수 있는 사람이 있습니까?
주 스레드가 반환될 때(즉, 사용자가 반환)main
function), 전체 프로세스를 종료합니다.여기에는 다른 모든 스레드가 포함됩니다.당신이 전화할 때도 똑같은 일이 일어납니다.exit
. 전화를 걸어 이를 피할 수 있습니다.pthread_exit
.
목적은pthread_detach
다른 스레드의 리소스를 해제하기 위해 다른 스레드와 가입할 필요가 없도록 만드는 것입니다.스레드를 분리한다고 프로세스 종료 후에도 해당 스레드가 존재하지는 않지만 다른 모든 스레드와 함께 삭제됩니다.
각 새 스레드에서 를 사용하여 하위 스레드에서 대기하도록 호출 스레드에 알려주고 실행을 일시 중지하며 해당 스레드가 종료될 때까지 프로세스를 종료해야 합니다.
생성된 스레드를 호출해도 프로세스가 종료된 후에는 해당 스레드가 유지되지 않습니다.Linux man 페이지에서:
분리된 속성은 스레드가 종료될 때 시스템의 동작을 결정할 뿐이며, 프로세스가 종료(3)를 사용하여 종료될 경우(또는 주 스레드가 반환될 경우) 스레드가 종료되는 것을 방지하지는 않습니다.
당신은 가끔 볼 수 있을 겁니다.main
명시적인 대신에 사용됨pthread_join
호출, 목적은 나가는 것입니다.main
이렇게 하면 다른 스레드가 계속 실행될 수 있습니다.실제로 리눅스 man 페이지에서는 다음과 같이 명시적으로 설명되어 있습니다.
다른 스레드가 실행을 계속할 수 있도록 하려면 기본 스레드가 exit(3)이 아닌 pthread_exit()를 호출하여 종료해야 합니다.
하지만 이것이 모든 플랫폼에서 예상되는 행동인지는 알 수 없으며, 항상 사용을 고수해 왔습니다.pthread_join
.
pthread_join
필요한 것은pthread_t
대상 스레드의 경우, 호출하기 전에 두 스레드를 모두 생성해야 하므로 코드를 약간 변경해야 합니다.pthread_join
두 사람을 기다리기 위해서요그래서 당신은 전화를 할 수 없습니다.startThread
. 당신은 A를 반환해야 합니다.pthread_t
, 또는 에 포인터를 전달합니다.pthread_t
당신에게startThread
기능.
프로세스의 모든 스레드는 다음에서 반환될 때 종료됩니다.main()
.
그libc
도서관은 호출에 의해 이 행동을 실행할 책임이 있는 사람입니다.exit()
그 때에main()
함수가 반환됩니다.차례로.exit()
function은 이름이 붙은 씬 wrapper function을 호출하게 됩니다._exit()
어느 것(시작부터)libc
v2.3)에서 최종적으로 exit_group 시스템 호출을 호출하여 프로세스를 종료하고 모든 스레드를 종료합니다.
이 마지막 시스템 호출은 여러분이 알아차린 행동에 대한 책임이 있는 호출입니다.
우리는 이 미묘한 음을 볼 수 있습니다._exit()
수동 여기:
C library/kernel differences
In glibc up to version 2.3, the _exit() wrapper function invoked
the kernel system call of the same name. Since glibc 2.3, the
wrapper function invokes exit_group(2), in order to terminate all
of the threads in a process.
만약 당신의 의도가 이런 행동을 피하는 것이라면, 유일한 선택은 전화하는 것입니다.pthread_exit
그것은 당신의 주요 실을 끝낼 것이고 당신이 다시 돌아오는 것을 막을 것입니다.libc
의__libc_start_main()
기능.
언급URL : https://stackoverflow.com/questions/11875956/when-the-main-thread-exits-do-other-threads-also-exit
'source' 카테고리의 다른 글
html 코드를 mysql에 저장하는 가장 좋은 방법은 무엇입니까? (0) | 2023.11.06 |
---|---|
Jquery $(이) 하위 선택기 (0) | 2023.11.06 |
malloc() 통화량을 최소화하면 성능이 향상됩니까? (0) | 2023.11.06 |
메모리에서 FLOOT 번호를 C로 표현하는 방법 (0) | 2023.11.06 |
RecyclerView vs.리스트뷰 (0) | 2023.11.06 |