多线程——线程的退出

一般来说,一个线程的退出,有多种方式:

1.return方式/exit/_exit

2.利用pthread_exit退出

3.利用phread_cancel

退出以下几种方式均可以让线程退出,但是相互间也是有区别的,下面通过实例来演示。

pthread_exit函数用于实现线程退出

头文件#include<pthread.h>

函数原型void    pthread_exit(void  *retval);

无返回值

参数列表

void  *retval:返回的参数NULL

#include<pthread.h>
#include<stdio.h>
void*first_func(void*arg)
{
    int i;
    int ret=1;
    printf("first pthread,pid=%d,first_tid=%lu\n",(int)getpid(),(unsigned      long)pthread_self());
    for(i=0;i<50;)
    {
        printf("funccnt=%d\n",++i);
        sleep(1);
    }
    return (void*)ret;
}

int main()
{
    int err,retval,i;
    pthread_t tid;
    err = pthread_create(&tid,NULL,(void*)first_func,NULL);
    if(err!=0)
    {
        printf("failtocreatapthread\n");
        return-1;
    }
    /*调试1*/
    //while(1);
    /*调试2*/
    //sleep(2);
    /*调试3:调用pthread_exit函数退出*/
    //pthread_exit(NULL);
    printf("exit....\n");
    return 0;
}

线程的分离和连接也可以实现线程退出

线程的取消

什么是线程取消?

一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。

取消过程是向目标线程发Cancel信号(pthread_cancel函数发送Cancel信号),但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态(pthread_setcancelstate函数设置状态)决定。

取消点(POSIX标准)pthread_join()

pthread_testcancel()

pthread_cond_wait()

pthread_cond_timedwait()

sem_wait()sigwait()等函数read()、write()等会引起阻塞的系统调用

printf()

由于LinuxThread库与C库结合得不好,因而目前C库函数都不是Cancelation-point;但CANCEL信号会使线程从阻塞的系统调用中退出,并置EINTR错误码。可以使用pthread_testcancel()设置自定义的取消点。

 

 

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

void*thread_func(void*arg)
{
    /*4.关闭取消功能*/
    int err;
    err=pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
    if(err!=0)
    {
        printf("failtosetstate\n");
    }

//-----------------------------------------------------
    printf("[-]enterthreadfunc\n");
    sleep(2);
    /*2.新增取消属性配置*/
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);//启动取消功能
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);//立即有效
    /*3.观察效果。如果是立即有效,则下面的内容均不会再执行,也不会再打印下面这句话*/
    printf("[-]threadexit\n");
    return (void*)1;
} 

int main()
{
    pthread_ttid;
    interr;
    void* retval;
    err=pthread_create(&tid,NULL,thread_func,NULL);
    if(err!=0)
    {
        printf("[+]createthreadfailed\n");
        return0;
    }printf("[+]createthreadsuccess\n");
    /*1.发送取消信号*/
    err=pthread_cancel(tid);
    if(err!=0)
    {
        printf("cancelthreadfailed\n");
        return -1;
    }
    pthread_join(tid,&retval);
    printf("[+]retval=%p\n",(int*)retval);
    printf("[+]mainthreadexit\n");return 0;
}

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:在PyQt5中,如果执行耗时的程序会导致页面卡顿。在给定的代码中,通过点击按钮来执行一个耗时的循环操作,每次循环都会使页面卡顿一秒钟。这是因为PyQt5需要等待程序执行完毕才能进行下一步操作。\[1\] 引用\[2\]:为了解决这个问题,可以使用QThread类创建线程。在重写的run()方法中,可以以每隔1秒的频率叠加输出数字,并且在数字为10时退出线程。通过使用线程,可以使页面保持响应,不会卡顿。\[2\] 引用\[3\]:另外,如果数据的读写非常耗费时间,也会导致界面卡死。在给定的代码中,通过点击按钮来执行一个耗时的循环操作,每次循环都会使界面卡死一秒钟。这是因为循环操作阻塞了主线程,导致界面无法响应。\[3\] 综上所述,为了避免界面卡顿,可以使用多线程来执行耗时的操作,保持界面的响应性。 #### 引用[.reference_title] - *1* *3* [PyQt5——多线程](https://blog.csdn.net/huayunhualuo/article/details/101446602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [九、PyQt5多线程编程](https://blog.csdn.net/ungoing/article/details/127271810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值