Linux 多线程技术.ppt_第1页
Linux 多线程技术.ppt_第2页
Linux 多线程技术.ppt_第3页
Linux 多线程技术.ppt_第4页
Linux 多线程技术.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

Linux多线程技术 POSIX线程库Pthreads 使用fork 创建进程代价昂贵进程间通信方式较复杂操作系统在实现进程间的切换比线程切换更费时 使用pthreads库创建线程创建进程比创建线程更快线程间的通信方式更容操作系统对线程的切换比对进程的切换更容易和快速 线程的创建 includeintpthread create pthread t thread pthread attr t attr void start routine void void arg 第一个参数为指向线程标识符的指针 第二个参数用来设置线程属性 第三个参数是线程运行函数的起始地址 最后一个参数是运行函数的参数 当创建线程成功时 函数返回0 若不为0则说明创建线程失败 常见的错误返回代码为EAGAIN和EINVAL 前者表示系统限制创建新的线程 例如线程数目过多了 后者表示第二个参数代表的线程属性值非法 一个简单例子 include include include include includepthread tntid void thr fn void arg printids newthread return void 0 intmain interr err pthread create 编译多线程程序 gcc omypthread lpthreadmypthread c 线程的退出 调用pthread exit 结束线程执行voidpthread exit void retval 让线程处理程序返回使用pthread cancel 函数终止其他线程的执行intpthread cancel pthread tthread 向线程t发送取消请求 默认情况下线程thread自己调用pthread exit PTHREAD CANCELED 等待线程结束 使用pthread join 函数等待被创建的线程结束pthread join 函数会挂起创建线程的线程的执行直到等待到想要等待的子线程函数原型 intpthread join pthread tth void thread return 线程的分离 主线程可以不断地创建子线程子线程本身自己有自我回收内存资源的能力函数原型 intpthread detach pthread tth pthread detach 和pthread join 一般情况下不能同时使用 获得当前线程的标志 pthread tpthread self void 本函数返回本线程的标识符 在LinuxThreads中 每个线程都用一个pthread descr结构来描述 其中包含了线程状态 线程ID等所有需要的数据结构 此函数的实现就是在线程栈帧中找到本线程的pthread descr结构 然后返回其中的p tid项 一个例子 include include include include defineTHREAD NUMBER2intretval hello1 2 retval hello2 3 void hello1 void arg char hello str char arg sleep 1 printf s n hello str pthread exit void hello2 void arg char hello str char arg sleep 2 printf s n hello str pthread exit printf Begintocreatethreads n ret val pthread create printf Begintowaitforthreads n for i 0 i THREAD NUMBER i ret val pthread join pt i void 线程属性的初始化和撤销 线程初始化 intpthread attr init pthread attr t attr 初始化线程属性对象attr 并用默认值填充线程撤销 intpthread attr destroy pthread attr t attr 销毁线程属性对象attr 修改线程属性对象attr只有在线程创建前有效 在线程创建后修改对当前线程不起作用 返回0成功 否则失败 pthread attr t定义 pthread attr t定义 typedefstruct pthread attr s int detachstate int schedpolicy struct sched param schedparam int inheritsched int scope size t guardsize int stackaddr set void stackaddr size t stacksize pthread attr t 线程的属性 线程的属性 续 相关函数 分离状态 设置分离状态 pthread attr setdetachstateintpthread attr setdetachstate pthread attr t attr intdetachstate 返回值 函数成功返回0 任何其他返回值都表示错误设置分离状态 参数detachstate的值为 PTHREAD CREATE DETACHED PTHREAD CREATE JOINABLE 获取分离状态 pthread attr getdetachstateintpthread attr getdetachstate pthread attr t attr int detachstate 返回值 函数成功返回0 任何其他返回值都表示错误取线程分离状态 分离的或是非分离的 相关函数 调度策略 设置调度策略 pthread attr setschedpolicyintpthread attr setschedpolicy pthread attr t tattr intpolicy 返回值 函数成功返回0 任何其他返回值都表示错误 POSIX标准定义的调度策略有 SCHED FIFO 先入先出 SCHED RR 循环 SCHED OTHER 由不同版本的POSIX线程库定义的缺省调度策略 获取调度策略 pthread attr getschedpolicyintpthread attr getschedpolicy pthread attr t tattr int policy 返回值 函数成功返回0 任何其他返回值都表示错误 相关函数 调度参数 设置调度参数 pthread attr setschedparamintpthread attr setschedparam pthread attr t tattr conststructsched param param 返回值 函数成功返回0 任何其他返回值都表示错误 属性对象的调度参数定义在param结构中 在这个结构中只定义了优先级priority成员 新创建线程的优先级由属性对象中param结构的priority参数指定 有两种方式可以修改线程的优先级 可以在创建子线程前设置属性对象的优先级参数 也可以先修改父线程的优先级 然后创建子线程 sched param结构中有可能存放着其他一些调度信息 所以在修改线程属性对象的调度参数前先取现有的调度参数是良好的习惯 一段合理的代码应该是这样的 先取线程属性对象中现有的调度参数 对取出的调度参数进行操作 再用修改过的调度参数重置线程属性对象 获取调度参数 pthread attr getschedparamintpthread attr getschedparam pthread attr t tattr conststructsched param param 返回值 函数成功返回0 任何其他返回值都表示错误 相关函数 域 设置域 pthread attr setscopeintpthread attr setscope pthread attr t tattr intscope 返回值 函数成功返回0 任何其他返回值都表示错误 指定将来创建的线程是绑定 PTHREAD SCOPE SYSTEM 的还是非绑定的 PTHREAD SCOPE PROCESS 在一个进程中可以同时有这两种不同类型的线程 获取域 pthread attr getscopeintpthread attr getscope pthread attr t tattr int scope 返回值 函数成功返回0 任何其他返回值都表示错误 例子 threadattr include include includevoid sum val void arg intsum 0 inti intcount int arg for i 0 i count i sum sum i printf sumis d n sum pthread exit 0 例子 threadattr 续 intmain intargc char argv pthread tpt intcount 10 i

温馨提示

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

评论

0/150

提交评论