一、基础了解
进程的产生 ----- fork
线程 --- 轻量级的进程 进程 --- 重量级的进程
线程 成为 CPU执行的最小单位 ,进程 成为 资源分配的基本单位
线程 创建 和 调度 时空开销都比进程小
线程组成:线程tid //thread ,程序计数器 ,寄存器集合,栈
线程与进程的关系:线程 是 存在于 进程中的
线程 共享了进程的资源 (代码段,数据段,打开一些文件,信号等)
线程结束,不一定导致进程结束
线程的编程 :类似与进程过程
二、线程的创建
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
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
void * do_something(void *arg)
{
//线程的任务函数
printf("------do_something ---- \n");
}
int main(int argc, const char *argv[])
{
pthread_t tid;
int ret = pthread_create(&tid,NULL,do_something,NULL);
if (ret != 0)
{
errno = ret;
perror("pthread_create fail");
return -1;
}
sleep(3);
return 0;
}
三、线程的执行
线程的执行 --- 就体现在线程的 执行函数(回调函数)上
四、线程的退出
pthread_exit
void pthread_exit(void *retval)
功能:结束调用的线程
参数: retval 退出状态值,传的是退出状态值 对应的地址,也可默认为NULL。
注意: pthread_exit 本身表示结束线程
如果用在main函数中 表示结束主线程
主线程结束 并不表示进程,此时,主线程执行流结束,进程会在其余线程都结束后,结束
五、线程的资源回收
int pthread_join(pthread_t thread, void **retval);
功能:等待线程结束
参数: thread --- 线程tid
retval --- 用来保存,退出状态值,所在空间的地址
返回值:成功 0,失败 错误码
注: 线程退出时,可以带出退出状态值,
但是传的是,退出状态值对应空间的地址
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
void * do_something(void *arg)
{
static int a = 10;
//线程的任务函数
printf("------do_something ---- \n");
pthread_exit(&a);
//pthread_exit((void *)a);
}
int main(int argc, const char *argv[])
{
pthread_t tid;
int ret = pthread_create(&tid,NULL,do_something,NULL);
if (ret != 0)
{
errno = ret;
perror("pthread_create fail");
return -1;
}
//sleep(3);
void *retval;
//pthread_join(tid,&retval);
pthread_join(tid,&retval);
printf("---- main----%d\n",*(int *)retval);
// printf("---- main----%d\n",(int)retval);
pthread_exit(NULL);
return 0;
}