1、第10章Linux多线程编程 线程基本概念与线程操作线程基本概念与线程操作 线程属性控制线程属性控制 线程调度策略线程调度策略 2022-1-202线程与进程的对比 2022-1-203线程资源 线程自己基本上不拥有系统资源,只拥有少量在运行中必不可少的资源(如程序计数器、一组寄存器、栈、线程信号掩码、局部线程变量和线程私有数据),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源(同一地址空间、通用的信号处理机制、数据与I/O)。进程在使用时占用了大量的内存空间,特别是进行进程间通信时一定要借助操作系统提供的通信机制,这使得进程有自身的弱点,而线程占用资源少,使用灵活,很多应用程序中都
2、大量使用线程,而较少的使用多进程,但是,线程不能脱离进程而存在,另外,线程的层次关系,执行顺序并不明显,对于初学者大量使用线程会增加程序的复杂度。2022-1-204进程/线程应用对比 应用功能线程进程创建pthread_createfork,vfork退出pthread_exitexit等待pthread_joinwait、waitpid取消/终止pthread_cancelabort读取IDpthread_self()getpid()调度策略SCHED_OTHER、SCHED_FIFO、SCHED_RRSCHED_OTHER、SCHED_FIFO、SCHED_RR通信机制信号量、信号、互斥
3、锁、条件变量、读写锁无名管道、有名管道、信号、消息队列、信号量、共享内存2022-1-205创建线程 2022-1-206线程退出与等待 新创建的线程从执行用户定义的函数处开始执行,直到出现以下情况时退出:调用pthread_exit函数退出。调用pthread_cancel函数取消该线程。创建线程的进程退出或者整个函数结束。其中的一个线程执行了exec类函数执行新的进程。2022-1-207等待线程 2022-1-208取消线程 取消线程是指取消一个正在执行线程的操作,当然,一个线程能够被取消并终止执行需要满足以下条件: 该线程是否可以被其它取消,这是可以设置的,在Linux系统下,默认是可
4、以被取消的,可用宏分配是PTHREAD_CANCEL_DISABLE和PTHREAD_CANCEL_ENABLE; 该线程处于可取消点才能取消。也就是说,该线程被设置为可以取消状态,另一个线程发起取消操作,该线程并不是一定马上终止,只能在可取消点才中止执行。可以设置为立即取消和在取消点取消。可用宏为PTHREAD_CANCEL_DEFERRED和PTHREAD_CANCEL_ASYNCHRONOUS。2022-1-209pthread_cancel() 2022-1-2010设置可取消状态 可设置的state的合法值: 如果目标线程的可取消性状态为PTHREAD_CANCEL_DISABLE,
5、则针对目标线程的取消请求将处于未决状态,启用取消后才执行取消请求。 如果目标线程的可取消性状态为PTHREAD_CANCEL_ENABLE,则针对目标线程的取消请求将被传递。默认情况下,在创建某个线程时,其可取消性状态设置为PTHREAD_CANCEL_ENABLE。2022-1-2011设置取消类型 pthread_setcanceltype()函数用来设置取消类型,即允许取消的线程在接收到取消操作后是立即中止还是在取消点中止,该函数声明如下:extern int pthread_setcanceltype (int _type, int *_oldtype)此函数有两个参数,type为调用
6、线程的可取消性类型所要设置的值。oldtype为存储调用线程原来的可取消性类型的地址。type的合法值包括: 如果目标线程的可取消性状态为PTHREAD_CANCEL_ASYNCHRONOUS,则可随时执行新的或未决的取消请求。 如果目标线程的可取消性状态为PTHREAD_CANCEL_DEFERRED,则在目标线程到达一个取消点之前,取消请求将一直处于未决状态。在创建某个线程时,其可取消性类型设置为PTHREAD_CANCEL_DEFERRED。第10章Linux多线程编程 线程基本概念与线程操作线程基本概念与线程操作 线程属性控制线程属性控制 线程调度策略线程调度策略 2022-1-201
7、3线程资源线程只拥有少量在运行中必不可少的资源,主要包括:程序计数器:标识当前线程执行的位置;一组寄存器:当前线程执行的上下文内容;栈:用于实现函数调用、局部变量。因此,局部变量是私有的;线程信号掩码:因此可以设置每线程阻塞的信号,见本书下一章内容;局部线程变量:在栈中申请的数据;线程私有数据。见前一小节介绍。2022-1-2014线程属性结构体 2022-1-2015线程ID 2022-1-2016初始化线程属性对象 extern int pthread_attr_init (pthread_attr_t *_attr) 属性缺省值描述scopePTHREAD_SCOPE_PROCESS新线
8、程与进程中的其他线程发生竞争detachstatePTHREAD_CREATE_JOINABLE线程可以被其它线程等待stackaddrNULL新线程具有系统分配的栈地址stacksize0新线程具有系统定义的栈大小priority0新线程的优先级为0inheritschedPTHREAD_EXPLICIT_SCHED新线程不继承父线程调度优先级schedpolicySCHED_OTHER新线程使用优先级调用策略2022-1-2017获取/设置线程detachstate属性 2022-1-2018获取/设置线程栈相关属性 2022-1-2019获取/设置stack地址属性 2022-1-202
9、0获取/设置栈保护区属性第10章Linux多线程编程 线程基本概念与线程操作线程基本概念与线程操作 线程属性控制线程属性控制 线程调度策略线程调度策略 2022-1-2022调度策略 在操作系统中,调度策略主要有: FIFO先入先出原则:首先请求服务的对象首先得到CPU的处理。 最短作业优先原则:需要最小系统时间的服务首先得到处理。 最高优先级优先原则:优先级最高的服务首先得到处理。 时间轮片原则:每个任务分配一个系统时间片,轮流执行。POSIX为线程指定了三个调度策略: SCHED_OTHER:系统默认策略。如时间轮片策略或基于优先级的调度策略。 SCHED_FIFO:先进先出原则。具有最高优先级的、等待时间最长的线程将成为下一个要执行的线程。 SCHED_RR:轮转调度。类似于FIFO,但加上了时间轮片策略。2022-1-2023获取/设置线程属性调度属性 2022-1-2024获取/设置调度策略属性 2022-1-2025获取/设置调度策略参数属性 2022-1-2026获取/设置指定线程调度属性