谈线程

1 线程是什么

线程是一个 执行流(运行代码,处理数据),简单来说是一段代码,一个函数

线程的概念:
1 先说进程: 操作系统中使用PCB来描述一个程序的运行-------PCB就是进程
2 Linux下PCB用来模拟实现线程,因此Linux下的PCB实际上是一个轻量级的进程
进程是资源分配的基本单位----因为程序运行时资源是分配给整个线程组(进程)的
线程是CPU调度的基本单位
在这里插入图片描述
**

2 线程间资源的独有与共享**

独有: 栈(每个线程在进程虚拟地址空间中有自己的存储空间) 寄存器(其实就是上下文数据) 信号屏蔽字(不想处理的信号)
errno 线程ID 调度的优先级

共享: 共享虚拟地址空间, 文件描述符表 信号处理方式 当前工作路径 用户ID /组ID

3线程控制 :线程创建/线程终止/线程等待/线程分离

 Linux 下 操作系统并没有提供线程的控制系统调用接口;因此大佬们封装了一个套线程控制接口库
  使用库函数实现创建的线程我们称之为 用户态线程, 这个用户态线程在内核中使用了有个轻量级进程实现调度
  Linux 下的线程  :  用户态线程 +轻量级进程

线程创建:

pthread_t  tid//定义一个线程地址变量,等线程创建成功之后可以存放该线程的地址
        // : pread_create 函数会产生一个线程ID.存放在第一个参数指向的地址中
int pthread_create(pthread_t*thread,const pthread_attr_t*attr,void*(start_route)(void*),void*arg);
        // thread  :  用于获取线程ID  --线程地址空间在整个虚拟地址空间中的首地址,这个ID就是后续对线程的操作句柄
        // attr : 设置线程属性,通常置空( NULL);
        // strat_routine :线程的入口函数,就是线程的执行函数,通过这个函数来执行这个线程
        // arg:  传递给线程函数的参数  ,这里面的参数类型必须和线程函数的参数类型保持一致
返回值    :创建成功 返回  0  创建失败  返回 错码 :非0值

在这里插入图片描述
线程中ID的讨论:

tid : 线程地址空间首地址
pcb->pid 轻量级进程ID
pcb->tgid 线程组ID,默认等于首线程ID
在这里插入图片描述
线程终止:

1   return   从线程函数中return  不能在main函数中return 退出的是进程(整个线程组)--导致所有线程退出

2    void pthread_exit(void*retval);  退出线程自己,哪个线程调用这个函数哪个线程就会退出
// retval 线程退出的返回值

3    int  pthread_cancel(pthread_t thread); 取消正在执行中的进程,让这个进程退出(一个线程可以调用这个这个函数来让同一进程中的其他线程退出).
//    thread   要取消的线程ID(也可以输入自己的线程ID,让自己退出   pthread_cancel(pthread_self())

在这里插入图片描述

温馨提示:

线程退出之后,默认不会自动释放资源.(保存自己的退出结果在线程独有的地址空间中);因此会造成资源泄漏.
主线程退出,其他线程依然可以正常运行

线程等待

概念 : 等待线程结束 ,获取退出线程的返回结果,释放退出线程的资源

一个线程创建出来,默认有一个属性叫做:joinable;处于joinable属性的线程退出后,不会自动释放资源;需要被其他线程等待,才能释放资源; 处于joinable属性的线程必须被等待,否则造成资源泄漏
实现函数:

int pthread_join(pthread_t thread.void**retval);
功能: 阻塞等待指定线程退出;通过retval 获取返回值

线程分离
*
默认情况下,新创建的线程是joinable属性(一般情况,一个默认属性的线程的退出,都是需要线程等待才能彻底释放资源)
*
线程分离就是将线程joinable属性修改为detach属性
*
线程若是处理detach属性,则线程退出后将自动回收资源(这个线程不需要等待,等待是毫无意义的,因为线程退出返回值占用的空间已经被回收了)
*
线程分离的使用场景:对线程的返回值不关心
*
线程分离可以在任意线程中实现

实现函数
int pthread_detach(pthread_t thread);
// thread :要分离的线程的ID
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页