LINUX环境高级编程-线程控制.ppt_第1页
LINUX环境高级编程-线程控制.ppt_第2页
LINUX环境高级编程-线程控制.ppt_第3页
LINUX环境高级编程-线程控制.ppt_第4页
LINUX环境高级编程-线程控制.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux环境高级编程 线程控制 线程属性同步属性取消选项线程和信号线程和fork线程和I O 主要内容 线程属性 讨论pthread create时 针对线程属性 传入的参数都是NULL 实际上 可以通过构建pthread attr t结构体 设置若干线程属性要使用该结构体 必须首先对其进行初始化 使用完毕后 需要销毁它 3 pthread attr t结构 typedefstruct intdetachstate 线程的分离状态intschedpolicy 线程的调度策略structsched paramschedparam 线程的调度参数 优先级 intinheritsched 线程的继承性intscope 线程的作用域size tguardsize 线程栈末尾的警戒缓冲区大小intstackaddr set 线程的栈设置void stackaddr 线程栈的位置size tstacksize 线程栈的大小 pthread attr t pthread attr t结构对应用程序是不透明的 也就是说应用程序无需了解属性结构内部的任何细节 因而可以增强应用程序的可移植性 POSIX定义了一系列属性査询和设置函数 包括pthread attr init pthread attr destroy 和与各个属性相关的pthread attr getXXX pthread attr setXXX函数 为了移植性 属性值不能直接设置 须使用相关函数进行操作 线程属性 初始化和销毁 函数原型 includeintpthread attr init pthread attr t attr intpthread attr destroy pthread attr t attr 参数与返回值成功返回0 否则返回错误编号attr 线程属性 确保attr指向的存储区域有效为了移植性 pthread attr t结构对应用程序是不可见的 应使用设置和查询等函数访问属性 5 线程属性 POSIX 1规定的一些线程属性detachstate 线程的分离状态属性guardsize 线程栈末尾的警戒缓冲区大小 字节数 stackaddr 线程栈的最低地址stacksize 线程栈的大小 字节数 6 设置分离状态属性 回忆什么是分离状态若对现有的某个线程的终止状态不感兴趣 可以使用pthread detach函数 使调用线程处于分离状态 以便让OS在线程退出时收回它所占的资源而不需要其他线程调用pthread join函数实际上 在创建线程时即可让线程以分离状态启动 7 设置分离状态 函数原型 includeintpthread attr setdetachstate pthread attr t attr intdetachstate 参数与返回值成功返回0 否则返回错误编号attr 线程属性结构体指针detachstate PTHREAD CREATE DETACHED 以分离状态启动线程PTHREAD CREATE JOINABLE 正常启动线程 默认属性 8 获取分离状态 函数原型 includeintpthread attr getdetachstate constpthread attr t attr int detachstate 参数与返回值成功返回0 否则返回错误编号attr 线程属性结构体指针detachstate指向的整数 可被设置为以下值PTHREAD CREATE DETACHED 以分离状态启动线程PTHREAD CREATE JOINABLE 正常启动线程 默认属性 9 获取线程栈属性 函数原型 includeintpthread attr getstack constpthread attr t attr void stackaddr size t stacksize 参数与返回值attr 线程属性stackaddr 该函数返回的线程栈的最低地址stacksize 该函数返回的线程栈的大小成功返回0 否则返回错误编号 10 设置线程栈属性 函数原型 includeintpthread attr setstack constpthread attr t attr void stackaddr size t stacksize 当用完线程栈时 可以再分配内存 并调用本函数设置新建栈的位置参数与返回值attr 线程属性stackaddr 新栈的内存单元的最低地址 通常是栈的开始位置 对于某些处理器 栈是从高地址向低地址方向伸展的 stackaddr就是栈的结尾stacksize 新栈的大小成功返回0 否则返回错误编号 11 获取 设置栈大小 函数原型 includeintpthread attr getstacksize constpthread attr t attr size t stacksize intpthread attr setstacksize pthread attr t attr size tstacksize 若希望改变栈的默认大小 但又不想自己处理线程栈的分配问题 可以使用上述函数 12 guardsize属性 线程属性guardsize控制着线程栈末尾之后用以避免栈溢出的扩展内存的大小该属性的默认设置为PAGESIZE个字节注意 若对stackaddr属性进行了修改 则系统认为我们会自己管理栈 并使警戒栈缓冲区机制无效 即guardsize 0 13 设置 获取guardsize属性 函数原型 includeintpthread attr getguardsize constpthread attr t attr size t guardsize intpthread attr setguardsize pthread attr t attr size t guardsize 若栈指针溢出到警戒区域 应用程序可能通过信号接收到出错信息 14 同步属性 互斥量属性读写锁属性条件变量属性 15 互斥量属性 前面讨论pthread mutex init时 针对互斥量属性 传入的参数都是NULL 实际上 可以通过构建pthread mutexattr t结构体 设置若干互斥量属性要使用该结构体 必须首先对其进行初始化 使用完毕后 需要销毁它 16 初始化和销毁 函数原型 includeintpthread mutexattr init pthread mutexattr t attr intpthread mutexattr destroy pthread mutexattr t attr 参数与返回值成功返回0 否则返回错误编号attr 互斥量属性 确保attr指向的存储区域有效为了移植性 pthread mutexattr t结构对应用程序是不可见的 应使用设置和查询等函数访问属性 17 进程共享属性 默认情况下互斥量属性中 进程共享属性设置为PTHREAD PROCESS PRIVATE即同一个进程中的多个线程可以访问同一个互斥量对象当进程共享属性为PTHREAD PROCESS SHARED时 从多个进程共享内存区域中分配的互斥量 就可以在多进程中使用 18 设置获取进程共享属性 函数原型 includeintpthread mutexattr getpshared constpthread mutexattr t attr int pshared intpthread mutexattr setpshared pthread mutexattr t attr intpshared 参数与返回值attr 互斥量属性pshared PTHREAD PROCESS PRIVATEPTHREAD PROCESS SHARED 19 类型互斥量属性 四种类型互斥量PTHREAD MUTEX NORMAL 标准的互斥量类型 不做任何特殊的错误检测或死锁检测PTHREAD MUTEX ERRORCHECK 提供错误检查PTHREAD MUTEX RECURSIVE 允许同一线程在互斥量解锁之前对该互斥量进行多次加锁 解锁的次数也要对应起来 PTHREAD MUTEX DEFAULT 在Linux中 该值为PTHREAD MUTEX NORMAL 20 类型互斥量属性 Relockwithoutunlock 未解锁的时候加锁Unlockwhennotowned 互斥量被一个进程加锁 但另一个进程调用了解锁操作Unlockwhenunlocked 已解锁时解锁 21 设置获取类型互斥量属性 函数原型 includeintpthread mutexattr getptype constpthread mutexattr t attr int type intpthread mutexattr setptype pthread mutexattr t attr inttype 参数与返回值attr 互斥量属性type 即四种类型成功返回0 否则返回错误编号 22 读写锁属性 初始化和销毁intpthread rwlockattr init pthread rwlockattr t intpthread rwlockattr destroy pthread rwlockattr t 读写锁的唯一属性 进程共享属性 与互斥量的该属性完全相同 获取 设置如下 intpthread rwlockattr getpshared constpthread rwlockattr t attr int pshared intpthread rwlockattr setpshared pthread rwlockattr t attr intpshared 23 条件变量属性 初始化和销毁intpthread condattr init pthread condattr t intpthread condattr destroy pthread condattr t 条件变量的属性 进程共享属性 与互斥量的该属性完全相同 获取 设置如下 intpthread condattr getpshared constpthread condattr t attr int pshared intpthread condattr setpshared pthread condattr t attr intpshared 24 取消选项 有两个线程属性没有包含在pthread attr t中 即可取消状态 可取消类型可取消状态的两种值PTHREAD CANCEL ENABLE 默认值 当pthread cancel调用后并不等待线程终止 线程达到某个取消点时 会检查是否有请求要求线程终止 PTHREAD CANCEL DISABLE pthread cancel并不能杀死线程 但是该请求将被处于未决状态 当变为PTHREAD CANCEL ENABLE后 将重新递送该请求 25 可取消状态的获取和设置 函数原型 includeintpthread setcancelstate intstate int oldstate 参数和返回值state 设置的状态oldstate 原来的状态成功返回0 否则返回错误编号 26 取消类型 默认的取消类型也称为延迟取消 PTHREAD CANCEL DEFERRED 在调用pthread cancel之后 在线程到达取消点之前 并不会出现真正的取消另一类型异步取消PTHREAD CANCEL ASYNCHRONOUS 线程可以在任意时间被取消 而不是非得遇到取消点才能被取消 27 取消点是线程检查是否被取消并按照请求进行动作的一个位置 POSIX 1保证线程调用一些函数时 取消点都会出现 取消点 取消类型的设置和获取 函数原型 includeintpthread setcanceltype inttype int oldtype 参数和返回值type 设置的类型oldtype 原来的类型成功返回0 否则返回错误编号 29 线程和信号 每个线程都有自己的信号屏蔽字 但是信号的处理是进程中所有线程共享的尽管单个线程可以阻止某些信号 但当另外线程修改了与某个信号相关的处理行为以后 所有的线程都必须共享这个处理行为的改变若一个线程选择忽略某个信号 而其他线程可以恢复信号的默认处理动作 或设置一个信号处理函数 从而撤销上述线程的选择 30 信号处理方式的覆盖 信号的处理方式 是进程范围内是唯一的任意线程 对信号处理方式的修改 对其余线程而言都是可见的 即它们共享同一处理方式 31 线程和信号 进程中的信号是递送到单个线程的 如果信号与硬件故障或计时器超时有关 该信号就被发送到引起该事件的线程中去而其他的信号则被发送到任意一个线程Linux中的情况真是如此吗 不同的系统实现 或有不同 32 信号的屏蔽 在进程编程模式下 使用sigprocmask来阻止信号的发送 但是 该函数的行为在多线程的进程中并未定义 线程必须使用pthread sigmask函数原型 includeintpthread sigmask inthow constsigset t set sigset t oset 33 pthread sigmask函数 intpthread sigmask inthow constsigset t set sigset t oset 返回值与参数成功返回0 出错返回错误编号oset 进程的当前信号屏蔽字通过oset返回 若不关心当前信号屏蔽字 可以设为NULL若set不为NULL 则若how SIG BLOCK 则进程新的信号屏蔽字是当前信号屏蔽字和set指向信号集的并集 set包含了希望阻塞的附加信号若how SIG UNBLOCK 则进程新的信号屏蔽字是当前信号屏蔽字和set指向信号集补集的交集 set包含了希望解除阻塞的信号若how SIG SETMASK 则进程新的信号屏蔽字将被set指向的信号集的值代替 34 使用sigprocmask函数的情况 其他线程在被创建时 其信号屏蔽字 会继承主线程的信号屏蔽字当将信号发送给进程时 信号首先会被递送到主线程 进程 若主线程屏蔽了该信号 则信号被递送到第一个被创建的线程 以次类推 直到找到未屏蔽该信号的线程当将信号直接递送给某个非主线程 进程 若该线程屏蔽了该信号 则首先将信号递送到主线程 然后再按照上述方式处理 35 sigwait函数 使得调用该函数的线程 可以等待一个或多个信号发生函数原型 includeintsigwait constsigset t set int signop 参数和返回值set 指定线程等待的信号集signop 指向的整数将作为返回值 即接收到的信号的ID成功返回0 否则返回错误编号 36 sigwait函数 在调用sigwait之前 必须要阻塞那些需要等待的信号sigwait函数会自动取消信号集的阻塞状态在sigwait返回之前 将自动恢复线程的信号屏蔽字当有信号达到时 sigwait函数返回 而此时信号处理函数不会被调用 若信号在sigwait调用之前没有被阻塞 在完成对sigwait调用之前会出现一个时间窗口 即某个信号可能在线程完成sigwait调用之前被递送了 37 sigwait函数 使用sigwait的好处在于

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论