多线程——线程的退出

多线程——线程的退出

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

1.return方式/exit/_exit

2.利用pthread_exit退出

3.利用phread_cancel

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

pthread_exit函数用于实现线程退出

头文件#include

函数原型void pthread_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(),(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

#include

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;

}

相关推荐

决斗之城什么时候出 公测上线时间预告

决斗之城什么时候出 公测上线时间预告

中文365bet 09-26
阅读更多
韭字旁的字有哪些

韭字旁的字有哪些

365商城官网下载 06-28
阅读更多
古代的“对食”和“菜户”,究竟指的是啥?其实很多人理解有误

古代的“对食”和“菜户”,究竟指的是啥?其实很多人理解有误

365商城官网下载 07-02
阅读更多