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);
}
结果: