当前位置: 首页 > article >正文

pthread_detach和pthread_cancel和pthread_euqal函数

pthread_detach函数:

线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后,其退出状态不由其他进程获取,而直接自己自动释放。

进程若有该机制,将不会产生僵尸进程。僵尸进程的产生是由于进程死后,大部分资源被释放,一点残余资源仍存在于系统中,导致内核认为该进程仍然存在。

我们可以使用pthread_detach函数设置线程分离。

函数作用:实现线程分离

函数原型:int pthread_detach(pthread_t thread);

函数返回值:

  • 成功返回0;
  • 失败返回失败号; 

注意:不能对一个已经处于detach状态的线程调用pthread_join函数,这样的调用将返回EINVAL错误。 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include <pthread.h>
void *mythread(void *arg)
{printf("id==[%ld]\n",pthread_self());
}
int main()
{//int pthread_create(pthread_t *thread, const pthread_attr_t *attr,// void *(*start_routine) (void *), void *arg);pthread_t thread;int ret=pthread_create(&thread,NULL,mythread,NULL);if(ret!=0){printf("pthread_create error:[%s]\n",strerror(ret));return -1;}
//设置线程号为thread的子线程为分离属性pthread_detach(thread);ret=pthread_join(thread,NULL);if(ret!=0){printf("prhread_join error:[%s]\n",strerror(ret));}printf("father thread id==[%ld]\n",pthread_self());sleep(1);
}

 

由结果我们可知对一个处于分离状态的子线程调用pthread_join函数,pthread_join函数并不会阻塞,而是直接返回错误。 

pthread_cancel函数:

函数描述:杀死(取消)线程。

函数原型:int pthread_cancel(pthread_t thread);

函数返回值:

  • 成功返回0;
  • 失败返回错位号; 

注意:线程的取消不是实时的,而是有一定的延时性。需要等待线程达到某个取消点(检查点)才会取消。

取消点:是线程检查是否取消,并按请求进行动作的一个位置。通常是一些系统调用creat,open,pause,close,read,write...等进入内核的执行命令时设置取消点。可认为一个系统调用(进入内核)即为一个取消点。还可以通过调用pthread_testcancel函数设置一个取消点。 

pthread_equal函数:

函数描述:比较两个线程id是否相同

函数原型:int pthread_equal(pthread_t t1, pthread_t t2); 

RETURN VALUEIf  the  two  thread  IDs  are equal, pthread_equal() returns a nonzerovalue; otherwise, it returns 0.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include <pthread.h>
void *mythread(void*arg)
{printf("child thread,pid==[%d],id==[%ld]\n",getpid(),pthread_self());
}
int main()
{pthread_t thread;int ret=pthread_create(&thread,NULL,mythread,NULL);if(ret!=0){printf("pthread_create error:[%s]\n",strerror(ret));return -1;}printf("father thread,id==[%ld]\n",pthread_self());if(pthread_equal(thread,pthread_self())==0){printf("two thread is no same\n");}else{printf("two thread is same\n");}
//设置阻塞,防止主线程退出,子线程还没有执行。pthread_join(thread,NULL);
}

结果:

http://www.lryc.cn/news/2414978.html

相关文章:

  • 【原创】支持模糊匹配站内全文检索的技术方案
  • linux内核 安卓8.0,安卓8.0系统下载-安卓8.0系统刷机包下载 --pc6下载站
  • NC:预测阿尔茨海默病的个体进展轨迹
  • 微信8.0状态视频素材免费下载
  • 英文常见姓氏列表
  • 基于java实现的计算机考试系统
  • 即时改变个性祝福网页源码
  • HTML入门(详细)
  • TCP,SSL以及HTTPS的连接建立过程详解
  • Head First Java(第2版)中文版.pdf免费资源下载链接,Head First Java第二版中文版.pdf
  • WinInet说明
  • android : 属性动画
  • #include
  • 工程型软件项目的配置管理实例 (二) ——配置管理双枪将VSS+SOS(上)
  • [FPGA学习]第一部分:FPGA基础知识
  • 基于java+ssm+jsp民宿预订管理系统设计与实现+vue(源码+lw+部署文档+讲解等)
  • 神经质的实质与治疗--神经质的分类
  • 使用Sysbench测试统信UOS或麒麟KYLINOS的CPU性能
  • Navisworks软件二次开发:二次开发中的性能优化技巧
  • 【html网页设计】 绿色的在线教育平台网站响应式企业网站模板
  • urp综合教务系统 php 课表,URP综合教务系统教师录入成绩指南
  • 开源漏洞扫描工具:安全卫士的利器
  • asp毕业设计——基于asp+access的房产信息管理系统设计与实现(毕业论文+程序源码)——房产信息管理系统
  • 神仙级Python入门教程,从入门到精通,看这一篇就够了!!!
  • 聚合支付之流程概述
  • 这个JavaScript基础教程你绝对是值得看的
  • 以太网,令牌网,FDDI,ATM,WLAN的区别
  • 推荐文章:探索数据的灯塔——Amundsen数据发现与元数据引擎
  • free video java hd_0326 iframe和video experience
  • 程序员微信ID