Linux学习目录
PCB1相当于主线程,新线程PCB2、PCB3、PCB4相当于用vfork创建出来的,它们指向同一块地址空间,它们隶属于同一个进程,但是他们有着自己的线程ID
#include
功能:创建一个新的线程
原型
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*star
t_routine)(void*), void *arg);
参数
thread:返回线程ID
attr:设置线程的属性,attr为NULL表⽰示使⽤用默认属性
start_routine:是个函数地址,线程启动后要执⾏的函数
arg:传给线程启动函数的参数
返回值:成功返回0;失败返回错误码
函数1:syscall(int number,...)//获取内核线程id
函数2:pthread_self()//获取用户态线程id
了解内核线性和用户态线程可参考这里:
https://blog.csdn.net/zhangye3017/article/details/80396745
功能:线程终止 原型
void pthread_exit(void *value_ptr);
参数
value_ptr:value_ptr
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)
功能:杀死一个执行中的线程
原型
int pthread_cancel(pthread_t thread);
参数
thread:线程ID
返回值:成功返回0;失败返回错误码
一个线程可以自己把自己杀死,也可以被别人杀死
eg1:
#include.h>
#include.h>
#include.h>
void *thread_run(void* arg)
{
while(1)
{
printf("new thread,thread is :%u,pid:%d\n",pthread_self(),getpid());
sleep(1);
pthread_exit(NULL);
}
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,thread_run,NULL);
while(1)
{//pthread_self()是获取线程id
printf("main thread,thread is :%u,pid:%d\n",pthread_self(),getpid()) ;
sleep(3);
pthread_cancel(pthread_self());//杀死自己
}
return 0;
}
主线程和新线程那个先运行完全由调度器决定,这里主线程先打印一句后,时间片轮转到新线程,新线程打印后遇pthread_exit(NULL)退出,主线程再睡3秒,遇到 pthread_cancel(pthread_self())退出。
使用pthread_cancel()函数需要注意:
pthread_cancel()函数并不是立即退出的,直到遇到cancel点它才会退出,而系统调用都是cancel点(如printf函数)。
如果没有cancel点就需要人为手动加cancel点
手动添加cancel点函数
pthread_testcancel(void)
为什么要线程等待呢?
int pthread_join(pthread_t thread,void **retval)
thread:线程ID
value_ptr:它指向一个指针,后者指向线程的返回值
返回值:成功返回0;失败返回错误码
作用:
- 主线程等待新线程退出,否则就会导致进程的内存泄漏
- 回收新线程的退出结果
eg2:
#include
#include
#include
void *thread_run(void* arg)
{
printf("new thread,thread is :%u,pid:%d\n",pthread_self(),getpid());
sleep(3);
return (void*)1;
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,thread_run,NULL);
sleep(3);
void* ret;//获取新线程返回的信息
pthread_join(tid,&ret);
printf("join new thread success,ret :%d\n",(int)ret);//打印退出码
return 0;
}
为什么要分离线程?
1:线程自己退出后释放自己资源
int pthread_detach(pthread_self())
2:线程组内其他线程对目标线程进行分离
int pthread_detach(pthread_t thread)
返回值:成功返回0,失败返回错误码
#include
#include
#include
#include
#include
void *thread_run( void * arg )
{
printf("new thread dead\n");
pthread_detach(pthread_self());
return NULL;
}
int main( void )
{
pthread_t tid;
if ( pthread_create(&tid, NULL, thread_run, "thread1 run...") != 0 ) {
printf("create thread");
}
void *ret;
sleep(1);
if ( pthread_join(tid, NULL ) == 0 )
{
printf("pthread wait success,ret:%d\n",(int )ret);
}
else
{
printf("pthread wait failed\n");
}
return 0;
}