您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 招标投标 > 10第10章 Linux多线程编程
Linux高级程序设计(第2版)Linux高级程序设计(第二版)人民邮电出版社出版杨宗德编著2009年9月Linux高级程序设计(第2版)第10章Linux多线程编程12线程基本概念与线程操作线程属性控制3线程调度策略Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著3线程与进程的对比全局变量代码段BSS区堆栈全局变量代码段BSS区堆栈进程A进程Bfork()全局变量代码段BSS区堆栈栈进程A线程Bpthread_creat()线程ALinux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著4线程资源•线程自己基本上不拥有系统资源,只拥有少量在运行中必不可少的资源(如程序计数器、一组寄存器、栈、线程信号掩码、局部线程变量和线程私有数据),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源(同一地址空间、通用的信号处理机制、数据与I/O)。•进程在使用时占用了大量的内存空间,特别是进行进程间通信时一定要借助操作系统提供的通信机制,这使得进程有自身的弱点,而线程占用资源少,使用灵活,很多应用程序中都大量使用线程,而较少的使用多进程,但是,线程不能脱离进程而存在,另外,线程的层次关系,执行顺序并不明显,对于初学者大量使用线程会增加程序的复杂度。Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著5进程/线程应用对比应用功能线程进程创建pthread_createfork,vfork退出pthread_exitexit等待pthread_joinwait、waitpid取消/终止pthread_cancelabort读取IDpthread_self()getpid()调度策略SCHED_OTHER、SCHED_FIFO、SCHED_RRSCHED_OTHER、SCHED_FIFO、SCHED_RR通信机制信号量、信号、互斥锁、条件变量、读写锁无名管道、有名管道、信号、消息队列、信号量、共享内存Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著6创建线程Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著7线程退出与等待•新创建的线程从执行用户定义的函数处开始执行,直到出现以下情况时退出:•调用pthread_exit函数退出。•调用pthread_cancel函数取消该线程。•创建线程的进程退出或者整个函数结束。•其中的一个线程执行了exec类函数执行新的进程。Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著8等待线程Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著9取消线程•取消线程是指取消一个正在执行线程的操作,当然,一个线程能够被取消并终止执行需要满足以下条件:–该线程是否可以被其它取消,这是可以设置的,在Linux系统下,默认是可以被取消的,可用宏分配是PTHREAD_CANCEL_DISABLE和PTHREAD_CANCEL_ENABLE;–该线程处于可取消点才能取消。也就是说,该线程被设置为可以取消状态,另一个线程发起取消操作,该线程并不是一定马上终止,只能在可取消点才中止执行。可以设置为立即取消和在取消点取消。可用宏为PTHREAD_CANCEL_DEFERRED和PTHREAD_CANCEL_ASYNCHRONOUS。Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著10pthread_cancel()Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著11设置可取消状态•可设置的state的合法值:–如果目标线程的可取消性状态为PTHREAD_CANCEL_DISABLE,则针对目标线程的取消请求将处于未决状态,启用取消后才执行取消请求。–如果目标线程的可取消性状态为PTHREAD_CANCEL_ENABLE,则针对目标线程的取消请求将被传递。默认情况下,在创建某个线程时,其可取消性状态设置为PTHREAD_CANCEL_ENABLE。Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著12设置取消类型•pthread_setcanceltype()函数用来设置取消类型,即允许取消的线程在接收到取消操作后是立即中止还是在取消点中止,该函数声明如下:externintpthread_setcanceltype(int__type,int*__oldtype)•此函数有两个参数,type为调用线程的可取消性类型所要设置的值。oldtype为存储调用线程原来的可取消性类型的地址。type的合法值包括:–如果目标线程的可取消性状态为PTHREAD_CANCEL_ASYNCHRONOUS,则可随时执行新的或未决的取消请求。–如果目标线程的可取消性状态为PTHREAD_CANCEL_DEFERRED,则在目标线程到达一个取消点之前,取消请求将一直处于未决状态。•在创建某个线程时,其可取消性类型设置为PTHREAD_CANCEL_DEFERRED。Linux高级程序设计(第2版)第10章Linux多线程编程12线程基本概念与线程操作线程属性控制3线程调度策略Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著14线程资源•线程只拥有少量在运行中必不可少的资源,主要包括:•程序计数器:标识当前线程执行的位置;•一组寄存器:当前线程执行的上下文内容;•栈:用于实现函数调用、局部变量。因此,局部变量是私有的;•线程信号掩码:因此可以设置每线程阻塞的信号,见本书下一章内容;•局部线程变量:在栈中申请的数据;•线程私有数据。见前一小节介绍。Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著15线程属性结构体Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著16线程IDLinux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著17初始化线程属性对象•externintpthread_attr_init(pthread_attr_t*__attr)属性缺省值描述scopePTHREAD_SCOPE_PROCESS新线程与进程中的其他线程发生竞争detachstatePTHREAD_CREATE_JOINABLE线程可以被其它线程等待stackaddrNULL新线程具有系统分配的栈地址stacksize0新线程具有系统定义的栈大小priority0新线程的优先级为0inheritschedPTHREAD_EXPLICIT_SCHED新线程不继承父线程调度优先级schedpolicySCHED_OTHER新线程使用优先级调用策略Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著18获取/设置线程detachstate属性Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著19获取/设置线程栈相关属性Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著20获取/设置stack地址属性Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著21获取/设置栈保护区属性Linux高级程序设计(第2版)第10章Linux多线程编程12线程基本概念与线程操作线程属性控制3线程调度策略Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著23调度策略•在操作系统中,调度策略主要有:–FIFO先入先出原则:首先请求服务的对象首先得到CPU的处理。–最短作业优先原则:需要最小系统时间的服务首先得到处理。–最高优先级优先原则:优先级最高的服务首先得到处理。–时间轮片原则:每个任务分配一个系统时间片,轮流执行。•POSIX为线程指定了三个调度策略:–SCHED_OTHER:系统默认策略。如时间轮片策略或基于优先级的调度策略。–SCHED_FIFO:先进先出原则。具有最高优先级的、等待时间最长的线程将成为下一个要执行的线程。–SCHED_RR:轮转调度。类似于FIFO,但加上了时间轮片策略。Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著24获取/设置线程属性-继承调度属性Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著25获取/设置调度策略属性Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著26获取/设置调度策略参数属性Linux高级程序设计(第2版)2020/1/26人民邮电出版社出版杨宗德编著27获取/设置指定线程调度属性
本文标题:10第10章 Linux多线程编程
链接地址:https://www.777doc.com/doc-3319389 .html