【Linux】线程概念

2019-07-14 08:35发布

多线程

一 ,Linux下的线程是什么? 1. 线程是进程中的一个执行流,线程是cpu调度的基本单位(进程是资源分配的基本单位) 2.一个进程中至少有一个线程,进程中至少有一个pcb 3.进程中的线程是运行在同一个虚拟地址空间上的 4.linux下的线程是以进程的pcb模拟的,linux下的pcb实际上是一个个的线程,因为 这些pcb相较于传统的pcb更加的轻量化(共用同一个虚拟地址空间),linux下的线程 也称为轻量级进程。 二,进程和线程 一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的: 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。 但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。 但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。 这就是进程和线程的重要区别。 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是 CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己 基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈), 但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 线程的优点: 因为使用同一个虚拟地址空间 1.线程的创建/销毁成本更低 **** 2.线程间通信更加方便 **** 3.线程的切换调度成本更低 ** 4.线程的执行粒度更加细致 ** 缺点: 1.因为缺乏访问控制,因此编码需要注意的问题更多。(临界资源的访问) 2.稳定性低 根据使用场景合理审视线程的优缺点 三,线程控制: 因为操作系统并没有提供线程控制的接口,因此大佬们就实现了一套库函数来进行 线程的控制。 因为线程的接口代码和数据都是在永华空间(共享区),因此也说我 们使用这套接口创建的线程是用户态的线程,但是线程在我们操作系统内 部对应了一个轻量级进程作为执行调度的载体。 线程创建: pthread_create 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;失败返回错误码 线程终止: void pthread_exit(void *retval); 方式: return,但是主线程中(main函数中)不能return pthread_exit 谁调用谁退出 自己退出 pthread_cancel 取消别的线程 退出那个线程 线程等待: 等待指定线程的退出 Only处于joinable状态的线程必须被等待的 线程退出后,为了保存退出返回值,因此操作系统不会直接自动回收资源, 需要其他线程等待,获取返回值,并允许操作系统回收资源;否则不等待则会造成资源泄露; pthread_join 线程的分离: 设置线程的分离属性,被设置的线程,退出后将直接自动回收资源,不需要被等待; 线程如果处于detach状态,则线程不能被等待; pthread_detach 线程返回值: 若线程被取消,则返回值是(PTHREAD_CANCELED -1) 若线程不是joinable状态,这时候如果等待则报错(EINVAL) 四,线程数据的独有和共享 共享:共享代码段和数据段 文件状态信息表 信息的处理方式 当前工作目录,用户id和组id 独有: 栈 一组寄存器(上下文数据,程序计数器) errno 信号屏蔽字(任一个线程阻塞的自己想阻塞的信号) 调度优先级