如果我不设置 '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.
#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.