一、主动退出
pthread_exit()
头文件
#include <pthread.h>
void pthread_exit(void *retval);
1、功能
1、功能
线程调用这个函数时,可以主动退出(终止)
它和exit()很像,exit()是终止整个程序,而pthread_exit()是终止次线程(并未终止整个进程)
如果你在次程序里面调用错误,调用的是exit(),整个线程就终止了
2、返回值
成功返回 0,失败返回非零值
3、参数
retval:线程结束的返回值
如果返回值很多时,就会封装成一个结构体,返回结构体变量的地址即可
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int i = 0;
int num = 5;
void *thread1(void *arg)
{
while(1)
{
printf("hello world!\n");
sleep(2);
pthread_exit(&num);
}
}
int main()
{
pthread_t id1;
if(pthread_create(&id1, NULL, thread1, NULL) != 0)
{
perror("pthread_create error!\n");
exit(1);
}
sleep(2);
int *num;
pthread_cancel(id1);
pthread_join(id1, (void *)(&num));
printf("this is thread! %d\n",*num);
//,*((int *)num)
return 0;
}
*return()
return (void )0;
注册线程退出处理函数
void pthread_cleanup_push(void (*routine)(void *
),void *arg);
void pthread_cleanup_pop(int execute);
弹栈线程退出处理函数的的几种条件:
pthread_cleanup_push(!0)主动弹栈
(0是不弹栈)
如果线程是被别人调用pthread_cancal取消的,也会弹栈
如果调用pthread_exit函数也是会主动弹栈
注意:return退出的话不会主动弹栈,想要自动弹栈用
void pthread_cleanup_pop(!0)
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int i = 0;
int num = 5;
void *theard_exit(void *arg)
{
printf("my exit!\n");
}
void *thread1(void *arg)
{
pthread_cleanup_push(pthread_exit, NULL);
while(1)
{
printf("hello world!\n");
sleep(1);
//pthread_exit(&num);
pthread_exit(NULL);
//return (void *)0;
}
pthread_cleanup_pop(!0);
}
int main()
{
pthread_t id1;
if(pthread_create(&id1, NULL, thread1, NULL) != 0)
{
perror("pthread_create error!\n");
exit(1);
}
sleep(1);
int *num;
pthread_cancel(id1);
pthread_join(id1, NULL);
printf("this is thread! %d\n",*((int *)num));
return 0;
}
4、线程等待目的
1、保证线程的退出顺序:保证一个线程退出并且回收资源后允许下一个进程退出
2、回收线程退出时的资源情况:保证当前线程退出后,创建的新线程不会复用刚才退出线程的地址空间
3、获得新线程退出时的结果是否正确退出返回值
5、线程状态
1、可结合态:这种状态下的线程是能被其他进程回收资源或被杀死的
2、可分离态:不能被其他进程回收资源或被杀,它存储的资源在它终止时由系统自动回收
默认情况下,线程是可结合态
二、线程分离函数
pthread_detach()
头文件
#include <pthread.h>
参数函数
int pthread_detach(pthread_t thread);
1、功能
如果次线程不希望别人调用pthread_join函数来回收,而是希望自己在运行结束时,自动回收资源调用pthread_detach
将pthread_detach()中的线程变为分离状态
(当一个分离线程终止时,它的资源会自动释放,返回系统,而不需要另一个线程与终止的线程连接)
注:把一个线程的属性设置为 detachd 的状态,让系统来回收它的资源;
把一个线程的属性设置为 joinable 状态,这样就可以使用 pthread_join() 来阻塞的等待一个线程的结束,并回收其资源,并且pthread_join() 还会得到线程退出后的返回值,来判断线程的退出状态 。
2、返回值
成功返回0,错误返回一个非零数字
3、参数
thread:你要分离的那个次线程的TID
example:
进程的所有基本信息存放在tach_struct
所有用户PId
调用优先级
地址空间
线程切换的实质:函数切换
三、进程和线程的区别
1、进程是资源分配的最小单位,线程是资源调度的最小单位
2、每个进程都有独立的地址空间,多个线程共享进程的地址空间,线程间的切换比进程间的切换开销要小
3、线程的调度必须通过频繁的加锁来保持线程的同步,影响线程的并发性
4、进程比线程更健康,多进程之间相互独立,一个进程的异常对其他进程无影响,而一个线程的崩溃会影响其他线程或整个程序的崩溃
5、线程之间的通信方便(小数据量的),同一进程下线程共享全局变量还有静态变量等数据,而进程间的通信需要一通信的方式进行(IPC),不过如何处理好同步和互斥,是编写多进程程序的难点。
6、多线程代码结构比多进程代码结构简单易读