C/C++|多线程——线程的退出

一般来说,一个线程的退出,有多种方式: 1.return方式/exit/_exit
2.利用pthread_exit退出
3.利用phread_cancel
退出以下几种方式均可以让线程退出,但是相互间也是有区别的,下面通过实例来演示。
pthread_exit函数用于实现线程退出 头文件#include
函数原型voidpthread_exit(void*retval);
无返回值
参数列表
void*retval:返回的参数NULL

#include#include void*first_func(void*arg) { int i; int ret=1; printf("first pthread,pid=%d,first_tid=%lu\n",(int)getpid(),(unsignedlong)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函数设置状态)决定。
【C/C++|多线程——线程的退出】取消点(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()设置自定义的取消点。
C/C++|多线程——线程的退出
文章图片


C/C++|多线程——线程的退出
文章图片


#include#includevoid*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; }




    推荐阅读