观察主线程退出对子线程的影响

文章探讨了主进程和子线程的不同退出方式(pthread_exit,return,exit(0),pthread_cancel),以及它们对子线程和进程状态的影响,强调了进程先于子进程退出时资源管理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主进程以pthread_exit(0)方式退出——线程退出
子线程pthread_cancel方式杀死父线程
主线程以return,exit(0)方式退出——进程退出
 🔱return
  🔱return在主函数
  🔶return在子函数
 🔶exit(0)
  🔶exit(0)在主函数
  🔱exit(0)在其他函数
主进程先于子进程退出状态时间线
总结

在这里插入图片描述

主进程以pthread_exit(0)方式退出——线程退出

主进程显示僵尸状态,子进程正常运行

void* Routine(void* t)
{
    int cnt=10;    
    while(cnt--)
    {
        cout<<"thread_1 is running"<<endl;
        sleep(1);
    }
    pthread_exit(0);
}
//1.主线程pthread_exit(0)退出对子线程的影响
void test1()
{
    // 主线程return退出——子线程能不能正常执行
    pthread_t tid;
    pthread_create(&tid,nullptr,Routine,nullptr);
    int cnt=5;
    while(cnt--)
    {
        cout<<"main thread is running"<<endl;
        sleep(1);
    }
    pthread_exit(0);
    // exit(0);// exit(0)是进程终止
    return;// 函数终止,线程并没有终止

    // 主线程pthread_exit(0)退出,子线程正常执行
}
int main()
{
    test1();
    
    return 0;
}

在这里插入图片描述

子线程pthread_cancel方式杀死父线程

子线程可以pthread_cancel方式杀死父线程,但是线程不能自杀

void* Routine(void* t)
{
    pthread_t id = *(pthread_t*)t;
    int cnt=10;    
    while(cnt--)
    {
        cout<<"thread_1 is running"<<endl;
        if(cnt==7) pthread_cancel(id);// 子线程在第3s的时候杀死主线程
        sleep(1);
    }
    pthread_exit(0);
}
//1.主线程pthread_exit(0)退出对子线程的影响

void test1()
{
    // 主线程return退出——子线程能不能正常执行
    pthread_t id = pthread_self();
    pthread_t tid;

    pthread_create(&tid,nullptr,Routine,&id);
    int cnt=5;
    while(cnt--)
    {
        cout<<"main thread is running"<<endl;
        sleep(1);
    }
    // pthread_exit(0);
    // exit(0);// exit(0)是进程终止
    return;// 函数终止,线程并没有终止

    // 主线程pthread_exit(0)退出,子线程正常执行
}
int main()
{
    test1();
    
    return 0;
}

在这里插入图片描述

主线程以return,exit(0)方式退出——进程退出

进程退出会直接终结所有线程

return

return在主函数

主函数return是终止进程

void* Routine(void* t)
{
    int cnt=10;    
    while(cnt--)
    {
        cout<<"thread_1 is running"<<endl;
        sleep(1);
    }
    pthread_exit(0);
}
int main()
{
    // test1();
    // 主线程return退出对子线程的影响
    pthread_t tid;
    pthread_create(&tid,nullptr,Routine,nullptr);
    int cnt=5;
    while(cnt--)
    {
        cout<<"main thread is running"<<endl;
        sleep(1);
    }
    // 主线程return退出,相当于exit,直接杀死进程
    return 0;
}

在这里插入图片描述

return在子函数

子函数return只是终止函数,并不会终止进程

void* Routine(void* t)
{
    int cnt=10;    
    while(cnt--)
    {
        cout<<"thread_1 is running"<<endl;
        sleep(1);
    }
    pthread_exit(0);
}
//1.主线程pthread_exit(0)退出对子线程的影响
void test1()
{
    // 主线程return退出——子线程能不能正常执行
    pthread_t tid;
    pthread_create(&tid,nullptr,Routine,nullptr);
    int cnt=5;
    while(cnt--)
    {
        cout<<"main thread is running"<<endl;
        sleep(1);
    }
    // pthread_exit(0);
    // exit(0);// exit(0)是进程终止
    return;// 函数终止,线程并没有终止

    // 主线程pthread_exit(0)退出,子线程正常执行
}
int main()
{
    test1();
    // 主线程return退出对子线程的影响
    // pthread_t tid;
    // pthread_create(&tid,nullptr,Routine,nullptr);
    int cnt=5;
    while(cnt--)
    {
        cout<<"main thread is running"<<endl;
        sleep(1);
    }
    // 主线程return退出,相当于exit,直接杀死进程
    // exit(0);
    
    return 0;
}

在这里插入图片描述

exit(0)

exit不论在哪里都是终止进程

exit(0)在主函数
void* Routine(void* t)
{
    int cnt=10;    
    while(cnt--)
    {
        cout<<"thread_1 is running"<<endl;
        sleep(1);
    }
    pthread_exit(0);
}
int main()
{
    // test1();
    // 主线程return退出对子线程的影响
    pthread_t tid;
    pthread_create(&tid,nullptr,Routine,nullptr);
    int cnt=5;
    while(cnt--)
    {
        cout<<"main thread is running"<<endl;
        sleep(1);
    }
    // 主线程return退出,相当于exit,直接杀死进程
    exit(0);
    return 0;
}

在这里插入图片描述

exit(0)在其他函数
void* Routine(void* t)
{
    int cnt=10;    
    while(cnt--)
    {
        cout<<"thread_1 is running"<<endl;
        sleep(1);
    }
    pthread_exit(0);
}
//1.主线程pthread_exit(0)退出对子线程的影响
void test1()
{
    // 主线程return退出——子线程能不能正常执行
    pthread_t tid;
    pthread_create(&tid,nullptr,Routine,nullptr);
    int cnt=5;
    while(cnt--)
    {
        cout<<"main thread is running"<<endl;
        sleep(1);
    }
    // pthread_exit(0);
    exit(0);// exit(0)是进程终止
    // return;// 函数终止,线程并没有终止
}
int main()
{
    test1();
    return 0;
}

在这里插入图片描述

主进程先于子进程退出状态时间线

请添加图片描述
不需要担心僵尸资源不会释放的问题,最终交由OS会释放

总结

  1. 主进程先于子进程退出——主进程僵尸,子进程正常运行
  2. exit——进程退出
  3. main函数return——进程退出
  4. 其他函数退出——函数退出
  5. pthread_exit(0)——线程退出
  6. pthread_cancel(id)——线程退出,不能自己杀自己,可以子杀父
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值