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_exit在main使用,而不是明确的pthread_join呼吁,其目的在于退出main以这种方式将允许其他线程继续运行.实际上,linux手册页明确说明了这一点:
要允许其他线程继续执行,主线程应该通过调用pthread_exit()而不是exit(3)来终止.
但我不知道这是否是所有平台上的预期行为,而且我一直坚持使用pthread_join.
pthread_join需要pthread_t为目标线程,所以你的代码需要改变一点,因为你需要在调用两个线程之前创建两个线程pthread_join.所以你不能打电话给它startThread.你需要返回一个pthread_t,或者将指针传递pthread_t给你的startThread函数.
Die*_*Epp 15
当主线程返回时,它终止整个进程.这包括所有其他线程.你打电话时也会发生同样的事情main.
目的exit是使它不需要与其他线程连接以释放其资源.分离线程不会使它在进程终止后存在,它仍将与所有其他线程一起销毁.