主线程退出,还有其他退出吗?

lai*_*jei 20 c multithreading pthreads

我在同一个进程中有关于主线程和其他线程的问题.当主函数返回时,其他线程也退出?我有些困惑.我写了一些测试代码,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

当"主线程返回"时.推出,线程test1和test2也退出,任何人都可以告诉我为什么?

pb2*_*b2q 26

您应该pthread_join()在每个新线程上使用,以通知调用线程在子线程上等待,暂停执行 - 并处理退出 - 直到这些线程终止.

pthread_detach在进程退出后,调用创建的线程将不会保留它们.从linux 手册页:

分离属性仅在线程终止时确定系统的行为; 如果进程使用exit(3)终止(或等效地,如果主线程返回),它不会阻止线程终止.

有时你会看到一个pthread_exitmain使用,而不是明确的pthread_join呼吁,其目的在于退出main以这种方式将允许其他线程继续运行.实际上,linux手册页明确说明了这一点:

要允许其他线程继续执行,主线程应该通过调用pthread_exit()而不是exit(3)来终止.

但我不知道这是否是所有平台上的预期行为,而且我一直坚持使用pthread_join.

pthread_join需要pthread_t为目标线程,所以你的代码需要改变一点,因为你需要在调用两个线程之前创建两个线程pthread_join.所以你不能打电话给它startThread.你需要返回一个pthread_t,或者将指针传递pthread_t给你的startThread函数.

  • 仔细阅读[`pthread_detach`](http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_detach.html)的文档.它没有做你想象的那样. (2认同)

Die*_*Epp 15

当主线程返回时,它终止整个进程.这包括所有其他线程.你打电话时也会发生同样的事情main.

目的exit是使它不需要与其他线程连接以释放其资源.分离线程不会使它在进程终止后存在,它仍将与所有其他线程一起销毁.

  • 这样写的答案是不正确的.当主线程(或任何线程)调用`exit`时,或者当`main`的初始调用返回时,整个进程退出.但主线程可以使用`pthread_exit`退出,而不会影响其他线程. (21认同)