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

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

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也退出,任何人都可以告诉我为什么?

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

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

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

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

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

您有时会在main使用pthread_exit而不是显式的pthread_join调用,意图是以这种方式退出main将允许其他线程继续运行。 实际上, linux手册页明确说明了这一点:

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

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

pthread_join需要pthread_t作为目标线程,所以你的代码需要改变一点,因为你需要在调用pthread_join之前创建两个线程来等待它们。 所以你不能在startThread调用它。 您需要返回一个pthread_t ,或者将指向pthread_t的指针传递给startThread函数。