1.进程的结束
进程结束的方式:1)return 结束,main中的return 2) exit() 注册清理函数(atexit) //库函数调用 3)_exit系统调用 4)主线程退出 5)主线程调用(pthread_exit(NULL))
异常终止:6)abort() 7)signal kill pid 8) 最后一个线程被pthread_cancle
2.在exit函数中 ,调用atexit函数
3.wait函数
功能:1.获取子进程退出状态 2 .回收资源(主要起到解决子进程僵尸态的问题)
注意:1.wait 本身是一个阻塞操作,,会使调用者阻塞 2.父进程要获得子进程的退出状态。
非阻塞调用:父进程会去查看子进程状态改变,但是,如果没有发生改变,父进程不阻塞,整个程序继续往下
非阻塞 必须 套在循环中处理
总结:1.wait 和 waitpid 都是 等待子进程状态改变
2.wait 是一种阻塞调用
3.waitpid 可以实现非阻塞调用
阻塞方式
2.线程
1.什么是线程
轻量级的进程,可一理解成进程的各个模块,一个进程可以包含多个线程,线程与线程之间是平等的,这是进程与线程的区别,这意味着主线程结束后,其他线程不会被强制结束。
2.线程的创建
pthread_create()
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
功能:该函数可以创建指定的一个线程。
参数:
@thread 线程id,需要实现定义并由该函数返回。
@attr 线程属性,一般是NULL,表示默认属性。(可结合性+分离属性)
默认(可结合性) -- 自己手动回收
分离属性 -- 系统自动回收
@start_routine -- 线程执行函数 (线程回调函数)
//指向[指针函数的] 函数指针。
本质上是一个函数的名称即可。
称为
th 回调函数,是线程的执行空间。
{
}
//注: 线程回调函数 --完成线程任务功能的函数
// 需要调用者 自己实现
@arg 回调函数的参数,即参数3的指针函数参数。
返回值:成功 0
失败 错误码
示例:
获得线程tid:
pthread_self(); //在那个线程中调用,获得的就是那个线程的tid
3.线程的退出
1)获取状态:pthread_join() 线程资源的回收
2)结束进程:pthread_exit(),能够返回线程中特定的值,以返回地址的形式。但是线程结束后,它所开的栈的内容会自己销毁,所以对于需要从线程中通过pthread_exit返回的值需要自己开辟一个栈,通过 " static "