如果我不设置 'pthread_join' 为什么线程会死掉

Why does thread just die if i dont set 'pthread_join'

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int count = 0;
pthread_mutex_t MUTEX = PTHREAD_MUTEX_INITIALIZER;

void* func1(void* a){
    pthread_mutex_lock(&MUTEX);
    for(;count < 4;count++){
        
        printf("LOOP 1: %d\n",count);
        sleep(1);
    }
    pthread_mutex_unlock(&MUTEX);
}

void* func2(void* a){
    pthread_mutex_lock(&MUTEX);
    for(;count < 8;count++){
        printf("LOOP 2: %d\n",count);
        sleep(1);
    }
    pthread_mutex_unlock(&MUTEX);
}

int main(){
    pthread_t tid[2];
    int a = 1;
    int status;

    if(pthread_create(tid,NULL,func1,(void*)&a))
        printf("func1 error\n");
    
    if(pthread_create(tid+1,NULL,func2,(void*)&a))
        printf("func2 error\n");

    //pthread_join(*tid, (void *) &status); 
    //pthread_join(*(tid+1), (void *) &status); 
}

用于测试线程和互斥体如何工作的简单代码。

如果我 运行 代码,它只是终止而不显示任何内容(有时只有一行“LOOP 1: 0”)

如果我取消评论

//pthread_join(*tid, (void *) &status); 
//pthread_join(*(tid+1), (void *) &status); 

那么效果很好

这是怎么发生的?有人请解释

pthread_join(t,...) 等待 直到线程 t 结束。也就是说,...join 调用不会 return 直到 t 完成。

所以,您的问题实际上是关于如果 main() 函数 return 而由 pthread_create(...) 创建的线程仍然是 运行,那么在 C 程序中会发生什么宁.

答案(至少,对于 一些 版本的 C)* 是在 main() returns 一些值之后, v,然后库调用 exit(v)。您可以查看手册页或您正在 运行 正在使用的任何系统的文档,以了解 exit(...) 还做了什么,但它所做的其中一件事是,它终止了整个进程,包括它的所有线程。


* 我不是 100% 确定 每个 版本的 C 和 C 标准库都以这种方式运行,但这是我习惯期望的行为。

另请注意,此行为与现代 C++ 不同,在现代 C++ 中,std::thread 实例可以继续 运行,即使在 main(...) 具有 returned.