第9节 多线程编程.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章 多线程编程 Linux线程概述 Linux线程编程 实验 线程概述(1) 进程是系统独立调度和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时时空开销很大,于是产生了线程。 线程是进程内独立的一条运行路线,处理器调度的最小单元,线程只具有很少的资源,共享所属进程的资源,故也称为轻量级进程。 一个进程可以有多个线程,它们共享进程的资源和地址空间,任何线程对系统资源的操作都会给其他线程带来影响。因此,多线程中的同步与互斥是非常重要的问题。 线程概述(2) 线程概述(3) (1)用户级线程 用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持。操作系统往往会提供一个用户空间的线程库,其提供了线程的创建、调度和撤销等功能,而内核仍然仅对进程进行管理。如果一个进程中的某一个线程调用了一个阻塞的系统调用函数,那么该进程及其所属的其他线程也同时被阻塞。用户级线程的主要缺点是在一个进程中的多个线程的调度中无法发挥多处理器的优势。 (2)轻量级进程 轻量级进程是内核支持的用户线程,是内核线程的一种抽象对象。每个线程拥有一个或多个轻量级线程,而每个轻量级线程分别被绑定在一个内核线程上。 线程概述(4) (3)内核线程 这种线程允许不同进程中的线程按照同一相对优先调度方法进行调度,这样就可以发挥多处理器的并发优势。 现在大多数系统都采用用户级线程与核心级线程并存的方法。一个用户级线程可以对应一个或几个核心级线程,也就是“一对一”或“多对一”模型。这样既可满足多处理机系统的需要,也可以最大限度地减少调度开销。 线程概述(5) 使用线程机制大大加快上下文切换速度而且节省很多资源。但是因为在用户态和内核态均要实现调度管理,所以会增加实现的复杂度和引起优先级翻转的可能性。一个多线程程序的同步设计与调试也会增加程序实现的难度。 线程概述(6) 在Linux2.2内核中,并不存在真正意义上的线程。当时Linux中常用的线程pthread实际上是通过进程来模拟的,也就是说Linux中的线程也是通过fork()创建的“轻”进程,并且线程的个数也很有限,最多只能有4096个进程/线程同时运行 。 Linux2.4内核消除了这个线程个数的限制,并且允许在系统运行中动态地调整进程数上限。当时采用的是LinuxThread线程库,它对应的线程模型是“一对一”线程模型,也就是一个用户级线程对应一个内核线程,而线程之间的管理在内核外的函数库中实现。 线程概述(7) Linux 2.6内核支持clone()系统调用,从而实现共享地址空间的进程机制。 第9章 多线程编程 Linux线程概述 Linux线程编程 实验 Linux线程编程 线程基本编程 线程之间的同步与互斥 互斥锁线程控制 信号量线程控制 线程属性 1 线程基本编程 (1) pthread_create(): 线程创建函数。 pthread_exit(): 线程退出函数,类似exit()。 pthread_join():线程挂起/等待函数,类似wait(),可以用于阻塞当前线程,直到被等待的线程结束为止,当函数返回时,被等待线程的资源就被收回。 1 线程基本编程 (3) 1 线程基本编程 (4) 2 线程之间的同步与互斥-互斥锁 互斥锁是用一种简单的加锁方法来控制对共享资源的原子操作。这个互斥锁只有两种状态,也就是上锁和解锁,可以把互斥锁看作某种意义上的全局变量。在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一个已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。可以说,这把互斥锁保证让每个线程对共享资源按顺序进行原子操作。 2 线程之间的同步与互斥-互斥锁 互斥锁机制主要包括下面的基本函数。 ? pthread_mutex_init() :互斥锁初始化 ? pthread_mutex_lock() :互斥锁上锁 ? pthread_mutex_trylock(): 互斥锁判断上锁 ? pthread_mutex_unlock(): 互斥锁解锁 ? pthread_mutex_destroy(): 消除互斥锁 2 线程之间的同步与互斥-互斥锁 互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁。区别主要在于未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待。 快速互斥锁: 调用线程会阻塞直至拥有互斥锁的线程解锁为止。 递归互斥锁: 能够成功地返回,并且增加调用线程在互斥上加锁的次数, 检错互斥锁: 快速互斥锁的非阻塞版本,它会立即返回并返回一个错误信息。

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档