UNIXLINUX环境多线程开发入门.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UNIX/LINUX多线程开发入门 杨永火 yhyang@ 2011-11-27 大纲 线程的概念 适用场景 线程协作模型 线程安全 Pthreads API 多线程管理 使用互斥量 使用条件变量 多线程调试 线程的概念(一) 进程为程序在操作系统里的一次执行 线程的概念(二) 线程为存在于进程内且可被操作系统独立调度的指令流实体 适用场景(一) 多线程使用轻量级方式处理多任务并发问题 核心概念是任务需要可并发执行,同时机器应为多处理器和多核处理器 适用场景(二) 根据2/8原理,80%的cpu只消耗在20%的代码上 如果这20%的代码可以做并发,则可使用多线程大幅度提升性能 多线程相比多进程或单进程需要更多的编程技巧 把整个程序设计成多线程会使开发效率降低,出错概率增加 建议只在20%的性能瓶颈部分代码做多线程化 可多线程典型任务: - 数据或任务可以分片并发执行 (flastGet) - I/O等待时间很长的 (Oracle的大查询) - 某些部分CPU密集型,其它部分则不是 线程协作模型 典型的线程间协作模型 - 老板/工人模型:主线程(老板)打包任务,放进任务列表,子线程(工人)从任务列表提取任务,执行任务;可以使用静态子线程池,也可以使用动态的子线程池。 - 流水线模型:每个任务被分为几个子阶段,每个任务在各个子阶段间串行执行,但是每个子阶段可以使用多个线程并发执行 - 伙伴模型:跟老板/工人模型类似,只是主线程在打包完任务后也参与到任务的执行 线程安全(一) 所有线程共享进程的全局资源,程序员需要负责保证对共享数据的同步访问 线程安全(二) 从每个线程的”main”函数开始调用的一系列函数都必须是线程安全的函数,包括库函数 在未确定某个库支持多线程的情况下,需假定该库不支持多线程,使用“顺序”方式使用该库的函数 Pthreads API(一) 历史上,计算机软硬件厂商都开发了各自私有的多线程实现 开发可移植的多线程程序非常困难 IEEE于1995年完成编程接口的标准化,POSIX 1003.1c standard 遵循该标准的多线程实现称为POSIX threads或Pthreads. Pthreads是一组C语言数据类型和库函数的集合,编译时包含pthread.h头文件,链接时包含-lpthread选项即可。 Pthreads API(二) 总共有100多个API,仅介绍最实用的3类API: - 线程管理: 创建行程,终止线程,分离线程,等待线程,线程属性的设置与查询 - 互斥变量:mutex -- mutual exclusion简写,创建/销毁互斥变量,对互斥变量进行加解锁 - 条件变量:解决线程间需要基于特定的条件进行互相通知的问题,创建和销毁条件变量,基于特定值等待某个条件变量,通知某个条件变量 Pthreads库所有函数和数据类型都以pthread_打头 线程管理(一) 创建和终止线程,程序启动时默认为单个主线程 pthread_create (thread, attr, start_routine, arg) pthread_exit (status) pthread_cancel (thread) 线程终止情况: - 线程的“main”函数正常结束 - 线程调用pthread_exit函数退出 - 被其他线程以pthread_cancel方式取消了 - 整个进程终止了,如主线程调用exit()/exec() - 主线程main函数结束,未调用pthread_exit 线程管理(二) 线程创建后,线程间都是对等的,任何线程都可以创建其他线程,并无任何特定的关系。 示例 ex_create.cpp ex_create_class.cpp ex_create_args.cpp ex_create_args_ok.cpp 线程管理(三) 线程有默认属性,可以通过属性对象设置线程属性 pthread_attr_init (attr) pthread_attr_destroy (attr) 可以使用属性查询API查询线程属性 - 分离或可等待状态 - 堆栈大小 - 堆栈地址 - 调度策略 … 线程管理(四) Join方法是线程间同步的一种方式: pthread_join (threadid, status) pthread_detach (threadid) pthread_attr_setdetachstate (attr, detachstate) pthread_attr_getdetachstate (attr, detachstate) 线程管理(五) 为了可移植性,最好显式申明线程是Joinable的 如果确定线程不需要被Join,

文档评论(0)

wuyoujun92 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档