Linux多线程编程手册.pdf





《Linux多线程编程手册.pdf》由会员分享,可在线阅读,更多相关《Linux多线程编程手册.pdf(318页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、多线程编程指南SunMicrosystems,Inc.4150NetworkCircleSantaClara,CA95054U.S.A.文件号码8197051102006年10月版权所有2005SunMicrosystems,Inc.4150NetworkCircle,SantaClara,CA95054U.S.A.保留所有权利。本文档及其相关产品的使用、复制、分发和反编译均受许可证限制。未经Sun及其许可方(如果有)的事先书面许可,不得以任何形式、任何手段复制本产品或文档的任何部分。第三方软件,包括字体技术,均已从Sun供应商处获得版权和使用许可。本产品的某些部分可能是从BerkeleyBS
2、D系统衍生出来的,并获得了加利福尼亚大学的许可。UNIX是X/OpenCompany,Ltd.在美国和其他国家/地区独家许可的注册商标。Sun、SunMicrosystems、Sun徽标、AnswerBook、AnswerBook2、和Solaris是SunMicrosystems,Inc.在美国和其他国家/地区的商标或注册商标。所有SPARC商标的使用均已获得许可,它们是SPARCInternational,Inc.在美国和其他国家/地区的商标或注册商标。标有SPARC商标的产品均基于由SunMicrosystems,Inc.开发的体系结构。OPENLOOK和SunTM图形用户界面是SunM
3、icrosystems,Inc.为其用户和许可证持有者开发的。Sun感谢Xerox在研究和开发可视或图形用户界面的概念方面为计算机行业所做的开拓性贡献。Sun已从Xerox获得了对Xerox图形用户界面的非独占性许可证,该许可证还适用于实现OPENLOOKGUI和在其他方面遵守Sun书面许可协议的Sun许可证持有者。美国政府权利商业软件。政府用户应遵循SunMicrosystems,Inc.的标准许可协议,以及FAR(FederalAcquisitionRegulations,即“联邦政府采购法规”)的适用条款及其补充条款。本文档按“原样”提供,对于所有明示或默示的条件、陈述和担保,包括对适销
4、性、适用性或非侵权性的默示保证,均不承担任何责任,除非此免责声明的适用范围在法律上无效。06101715490目录前言.111多线程基础介绍.15定义多线程术语.15符合多线程标准.16多线程的益处.17提高应用程序的响应.17有效使用多处理器.17改进程序结构.17占用较少的系统资源.17结合线程和RPC(远程过程调用).18多线程概念.18并发性和并行性.18多线程结构一览.18线程调度.19线程取消.19线程同步.20使用64位体系结构.202基本线程编程.23线程库.23创建缺省线程.23等待线程终止.25简单线程的示例.26分离线程.28为线程特定数据创建键.28删除线程特定数据键.
5、30设置线程特定数据.313获取线程特定数据.31获取线程标识符.35比较线程ID.36初始化线程.36停止执行线程.37设置线程的优先级.38获取线程的优先级.39向线程发送信号.40访问调用线程的信号掩码.41安全地Fork.41终止线程.42结束.42取消线程.43取消线程.44启用或禁用取消功能.45设置取消类型.46创建取消点.46将处理程序推送到栈上.47从栈中弹出处理程序.473线程属性.49属性对象.49初始化属性.50销毁属性.51设置分离状态.52获取分离状态.53设置栈溢出保护区大小.54获取栈溢出保护区大小.55设置范围.55获取范围.57设置线程并行级别.57获取线程
6、并行级别.58设置调度策略.58获取调度策略.59设置继承的调度策略.60获取继承的调度策略.61目录多线程编程指南 2006年10月4设置调度参数.62获取调度参数.63设置栈大小.65获取栈大小.66关于栈.67设置栈地址和大小.68获取栈地址和大小.704用同步对象编程.73互斥锁属性.74初始化互斥锁属性对象.75销毁互斥锁属性对象.76设置互斥锁的范围.76获取互斥锁的范围.77设置互斥锁类型的属性.78获取互斥锁的类型属性.79设置互斥锁属性的协议.80获取互斥锁属性的协议.82设置互斥锁属性的优先级上限.83获取互斥锁属性的优先级上限.84设置互斥锁的优先级上限.84获取互斥锁的
7、优先级上限.85设置互斥锁的强健属性.86获取互斥锁的强健属性.88使用互斥锁.89初始化互斥锁.89使互斥保持一致.90锁定互斥锁.91解除锁定互斥锁.93使用非阻塞互斥锁锁定.94销毁互斥锁.95互斥锁定的代码示例.96条件变量属性.102初始化条件变量属性.103删除条件变量属性.103设置条件变量的范围.104目录5获取条件变量的范围.105使用条件变量.106初始化条件变量.106基于条件变量阻塞.108解除阻塞一个线程.109在指定的时间之前阻塞.111在指定的时间间隔内阻塞.113解除阻塞所有线程.114销毁条件变量状态.116唤醒丢失问题.117生成方和使用者问题.117使用信
8、号进行同步.121命名信号和未命名信号.122计数信号量概述.122初始化信号.123增加信号.125基于信号计数进行阻塞.126减小信号计数.126销毁信号状态.127使用信号时的生成方和使用者问题.128读写锁属性.130初始化读写锁属性.131销毁读写锁属性.131设置读写锁属性.132获取读写锁属性.132使用读写锁.133初始化读写锁.133获取读写锁中的读锁.134读取非阻塞读写锁中的锁.135写入读写锁中的锁.136写入非阻塞读写锁中的锁.136解除锁定读写锁.137销毁读写锁.137跨进程边界同步.138生成方和使用者问题示例.138比较元语.141目录多线程编程指南 2006
9、年10月65使用Solaris软件编程.143进程创建中的fork问题.143Fork-One模型.144Fork-all模型.147选择正确的Fork.147进程创建:exec和exit问题.147计时器、报警与剖析.148每LWPPOSIX计时器.148每线程报警.148剖析多线程程序.149非本地转向:setjmp和longjmp.149资源限制.149LWP和调度类.149分时调度.150实时调度.150公平共享调度程序.151固定优先级调度.151扩展传统信号.151同步信号.152异步信号.152延续语义.152对信号执行的操作.154定向于线程的信号.155完成语义.157信号处
10、理程序和异步信号安全.158中断对条件变量的等待.160I/O问题.161I/O作为远程过程调用.161人为的异步性.162异步I/O.162共享的I/O和新的I/O系统调用.163getc和putc的替代项.1646安全和不安全的接口.165线程安全.165MT接口安全级别.167目录7不安全接口的可重复执行函数.168异步信号安全函数.168库的MT安全级别.169不安全库.1697编译和调试.171编译多线程应用程序.171为编译做准备.171选择Solaris语义或POSIX语义.171包括或.172定义_REENTRANT或_POSIX_C_SOURCE.173使用libthread
11、或libpthread链接.173与POSIX信号的-lrt链接.174将原有模块与新模块链接.174备用线程库.175调试多线程程序.175多线程程序中常见的疏忽性问题.175使用TNF实用程序跟踪和调试.176使用truss.176使用mdb.176使用dbx.1778Solaris线程编程.179比较Solaris线程和POSIX线程的API.179API的主要差异.179函数比较表.180Solaris线程的独有函数.183暂停执行线程.183继续执行暂停的线程.185相似的同步函数读写锁.186初始化读写锁.186获取读锁.188尝试获取读锁.188获取写锁.189尝试获取写锁.18
12、9解除锁定读写锁.190目录多线程编程指南 2006年10月8销毁读写锁的状态.191相似的Solaris线程函数.193创建线程.193获取最小栈大小.195获取线程标识符.196停止执行线程.196向线程发送信号.197访问调用线程的信号掩码.197终止线程.198等待线程终止.198创建线程特定的数据键.200设置线程特定的数据值.201获取线程特定的数据值.201设置线程的优先级.202获取线程的优先级.203相似的同步函数互斥锁.204初始化互斥锁.204销毁互斥锁.206获取互斥锁.207释放互斥锁.207尝试获取互斥锁.208相似的同步函数:条件变量.208初始化条件变量.208
13、销毁条件变量.210等待条件.210等待绝对时间.211等待时间间隔.212解除阻塞一个线程.213解除阻塞所有线程.213相似的同步函数:信号.214初始化信号.214增加信号.215基于信号计数阻塞.216减小信号计数.216销毁信号状态.217跨进程边界同步.218生成方和使用者问题示例.218目录9fork()和Solaris线程的特殊问题.2209编程原则.221重新考虑全局变量.221提供静态局部变量.222同步线程.223单线程策略.224可重复执行函数.224避免死锁.226与调用相关的死锁.227锁定原则.227线程代码的一些基本原则.227创建和使用线程.228使用多处理器
14、.228基础体系结构.229线程程序示例.233需要进一步阅读的内容.233A样例应用程序:多线程grep.235tgrep的说明.235BSolaris线程示例:barrier.c.293索引.303目录多线程编程指南 2006年10月10前言多线程编程指南介绍了SolarisTM操作系统(SolarisOperatingSystem,SolarisOS)中POSIX线程和Solaris线程的多线程编程接口。本指南将指导应用程序程序员如何创建新的多线程程序以及如何向现有的程序中添加多线程。尽管本指南同时介绍了POSIX线程接口和Solaris线程接口,但大多数主题都以POSIX线程为重点。仅
15、适用于Solaris线程的信息将专门在一章中介绍。要理解本指南,读者必须熟悉并发编程的概念:IUNIXSVR4系统首选是Solaris发行版。IC编程语言多线程接口由标准C库提供。I并发编程(与顺序编程相对)的原理。注本Solaris发行版支持使用SPARC和x86系列处理器体系结构的系统:UltraSPARC、SPARC64、AMD64、Pentium和XeonEM64T。支持的系统可以在http:/ have mail.前言多线程编程指南 2006年10月12表P1印刷约定(续)字体或符号含义示例AaBbCc123用户键入的内容,与计算机屏幕输出的显示不同machine_name%suPa
16、ssword:AaBbCc123要使用实名或值替换的命令行占位符要删除文件,请键入rmfilename。AaBbCc123保留未译的新词或术语以及要强调的词这些称为class选项。新词术语强调新词或术语以及要强调的词必须成为超级用户才能执行此操作。书名书名阅读用户指南的第6章。命令中的shell提示符示例下表列出了Cshell、Bourneshell和Kornshell的缺省系统提示符和超级用户提示符。表P2Shell提示符Shell提示符Cshellmachine_name%Cshell超级用户machine_name#Bourneshell和Kornshell$Bourneshell和Ko
17、rnshell超级用户#前言1314多线程基础介绍多线程一词可以解释为多个控制线程或多个控制流。虽然传统的UNIX进程包含单个控制线程,但多线程(multithreading,MT)会将一个进程分成许多执行线程,其中每个线程都可独立运行。本章介绍了一些多线程的术语和概念及其所产生的益处。如果您已准备好开始使用多线程,请跳至第2章。I第15页中的“定义多线程术语”I第16页中的“符合多线程标准”I第17页中的“多线程的益处”I第18页中的“多线程概念”定义多线程术语表11介绍了本书中所使用的一些术语。表11多线程术语术语定义Process(进程)通过fork(2)系统调用创建的UNIX环境(如文
18、件描述符和用户ID等),为运行程序而设置。Thread(线程)在进程上下文中执行的指令序列。POSIXpthread符合POSIX线程的线程接口。Solaristhread(Solaris线程)不符合POSIX线程的SunMicrosystemsTM线程接口,pthread的前序节点。single-threaded(单线程)仅允许访问一个线程。Multithreading(多线程)允许访问两个或多个线程。1第1章15表11多线程术语(续)术语定义User-levelorApplication-levelthread(用户级线程或应用程序级线程)在用户空间(而非内核空间)中由线程调度例程管理的线
19、程。Lightweightprocess(轻量进程)用来执行内核代码和系统调用的内核线程,又称作LWP。从Solaris9开始,每个线程都有一个专用的LWP。Boundthread(绑定线程)(过时的术语)指的是在Solaris9之前,和一个LWP永久绑定的用户级线程。从Solaris9开始,每个线程都有一个专用的LWP。Unboundthread(非绑定线程)(过时的术语)指的是在Solaris9之前,无须和一个LWP绑定的用户级线程。从Solaris9开始,每个线程都有一个专用的LWP。Attributeobject(属性对象)包含不透明数据类型和相关处理函数。这些数据类型和函数可以对PO
20、SIX线程一些可配置的方面,例如互斥锁(mutex)和条件变量,进行标准化。Mutualexclusionlock(互斥锁)用来锁定和解除锁定对共享数据访问的函数。Conditionvariable(条件变量)用来阻塞线程直到状态发生变化的函数。Read-writelock(读写锁)可用于对共享数据进行多次只读访问的函数,但是要修改共享数据则必须以独占方式访问。Countingsemaphore(计数信号量)一种基于内存的同步机制。Parallelism(并行性)如果至少有两个线程正在同时执行,则会出现此情况。Concurrency(并发性)如果至少有两个线程正在进行,则会出现此情况。并发是一
21、种更广义的并行性,其中可以包括分时这种形式的虚拟并行性。符合多线程标准多线程编程的概念至少可以回溯到二十世纪六十年代。多线程编程在UNIX系统中的发展是从八十年代中期开始的。虽然对多线程的定义以及对支持多线程所需要的功能存在共识,但是用于实现多线程的接口有很大不同。在过去的几年内,POSIX(PortableOperatingSystemInterface,可移植操作系统接口)1003.4a工作小组一直致力于制定多线程编程标准。现在,该标准已得到认可。该多线程编程指南基于POSIX标准IEEEStd1003.11996版(又称作ISO/IEC99451第二版)。最新修订版的POSIX标准IEE
22、EStd1003.1:2001(又称作ISO/IEC9945:2002和单一UNIX规范版本3)中也提供了这些功能。特定于Solaris线程的主题将在第8章中进行介绍。符合多线程标准多线程编程指南 2006年10月16多线程的益处本节简要介绍多线程的益处。在代码中实现多线程具有以下益处:I提高应用程序的响应I更有效地使用多处理器I改进程序结构I占用较少的系统资源提高应用程序的响应可以对任何一个包含许多相互独立的活动的程序进行重新设计,以便将每个活动定义为一个线程。例如,多线程GUI的用户不必等待一个活动完成即可启动另一个活动。有效使用多处理器通常,要求并发线程的应用程序无需考虑可用处理器的数量
23、。使用额外的处理器可以明显提高应用程序的性能。具有高度并行性的数值算法和数值应用程序(如矩阵乘法)在多处理器上通过多个线程实现时,运行速度会快得多。改进程序结构许多应用程序都以更有效的方式构造为多个独立或半独立的执行单元,而非整块的单个线程。多线程程序比单线程程序更能适应用户需求的变化。占用较少的系统资源如果两个或多个进程通过共享内存访问公用数据,则使用这些进程的程序可以实现对多个线程的控制。但是,每个进程都有一个完整的地址空间和操作环境状态。每个进程用于创建和维护大量状态信息的成本,与一个线程相比,无论是在时间上还是空间上代价都更高。此外,进程间所固有的独立性使得程序员需要花费很多精力来处理
24、不同进程间线程的通信或者同步这些线程的操作。多线程的益处第1章 多线程基础介绍17结合线程和RPC(远程过程调用)通过将多个线程和一个远程过程调用(remoteprocedurecall,RPC)结合起来,可以充分利用无共享内存的多处理器(如工作站集合)。这种结合将工作站集合视为一个多处理器,从而使应用程序的分布变得相对容易些。例如,一个线程可以创建多个子线程,每个子线程随后可以请求远程过程调用,从而调用另一个工作站上的过程。尽管初始线程此时仅创建了一些并行运行的线程,但是这种并行性会涉及到其他计算机。多线程概念本节介绍多线程的基本概念。并发性和并行性在单个处理器的多线程进程中,处理器可以在线
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 多线程 编程 手册

限制150内