source

메인 스레드가 종료되면 다른 스레드도 종료됩니까?

manysource 2023. 11. 6. 21:55

메인 스레드가 종료되면 다른 스레드도 종료됩니까?

같은 과정에서 메인 쓰레드와 다른 쓰레드에 문제가 있습니다.메인 기능이 돌아오면 다른 스레드도 종료됩니까?저는 이것에 대해 혼란스럽습니다.

다음 테스트 코드를 고려합니다.

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도 ,을 종료합니다. 이유를 알려줄 수 있는 사람이 있습니까?

주 스레드가 반환될 때(즉, 사용자가 반환)mainfunction), 전체 프로세스를 종료합니다.여기에는 다른 모든 스레드가 포함됩니다.당신이 전화할 때도 똑같은 일이 일어납니다.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()어느 것(시작부터)libcv2.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