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()设置自定义的取消点。
文章图片
文章图片
#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;
}
推荐阅读
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- opencv|opencv C++模板匹配的简单实现
- Linux下面如何查看tomcat已经使用多少线程