LINUX环境高级编程(六)_第1页
LINUX环境高级编程(六)_第2页
LINUX环境高级编程(六)_第3页
LINUX环境高级编程(六)_第4页
LINUX环境高级编程(六)_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、LINUX环境高级编程中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院 朱静朱静中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线线 程程避免死锁避免死锁线程的同步线程的同步线程创建与终止线程创建与终止线程概念的引入线程概念的引入多线程多线程v并发执行的进程具有两个基本的属性并发执行的进程具有两个基本的属性 (1 1)资源分配属性。操作系统以进程为单位分)资源分配属性。操作系统以进程为单位分配虚地址空间、主存和其它系统资源;配虚地址空间、主存和其它系统资源; (2 2)调度属性。操作系统需要为进程分配调度)调度属性。操作系统需要为进程分配调度CPUCPU时间。时间。 这

2、两个基本属性使进程成为并发执行的基本单这两个基本属性使进程成为并发执行的基本单位。在一些位。在一些OSOS中,大多数中,大多数UNIXUNIX系统、系统、LinuxLinux等,进程等,进程同时具有这两个属性。而另一些同时具有这两个属性。而另一些OSOS中,象中,象WinNTWinNT、SolarisSolaris、OSOS2 2、Mac OSMac OS等,这两个属性由等,这两个属性由OSOS独立独立处理。处理。为了区分两个属性,为了区分两个属性,资源分配单位称为进程资源分配单位称为进程(或任务),(或任务),调度单位称为线程调度单位称为线程。线程概念的引入线程概念的引入中国地质大学(武汉)

3、计算机学院中国地质大学(武汉)计算机学院v线程线程中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程概念的引入线程概念的引入v进程和线程的关系进程和线程的关系中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程概念的引入线程概念的引入进程控制块PCB用户地址空间线程控制块TCB用户栈核心栈线程控制块TCB用户栈核心栈线程控制块TCB用户栈核心栈多线程进程模块线程A线程B线程C多线程是OS在一个进程内支持多个线程的能力。中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程概念的引入线程概念的引入单线程与多线程的比较单线程与多线程的比较ThreadContro

4、lBlockUserStackUserStackKernelStackKernelStackUserAddressSpaceUserAddressSpaceProcessControlBlockProcessControlBlockThreadSingle-ThreadedProcess ModelMultithreaded Process ModelThreadControlBlockUserStackKernelStackThreadThreadControlBlockUserStackKernelStackThread中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院v线程的特

5、征线程的特征 创建线程比创建进程快,且节省开销。 一个进程至少要有一个可执行线程,可以有多个线程。 一个线程可以创建它所需的其他线程。 一个线程可以有就绪,等待,运行等状态。 进程可创建多个线程来执行同一个程序的不同部分,方便而有效地实现并行性并行性。 每个线程有一个线程ID,进程ID在整个系统中是唯一的,但线程线程IDID只在它所属的进程环境中只在它所属的进程环境中有效有效。中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程概念的引入线程概念的引入v创建线程创建线程#include pthread_t pthread_createpthread_create(pthread_t

6、 *restrict thread,const pthread_attr_t *restrict attr,void *(*start_routine)(void *),void *restrict arg);调用成功返回由thread指向的线程ID,attr参数用于指定线程属性,attr设为NULL表示创建默认属性的线程。新建线程从start_routine函数的地址开始运行,arg是传递给该函数的参数。例: 创建新线程 thread1.c (LP P420) 打印线程ID threadid.c $gcc thread1.c $gcc thread1.c o thread1 o thread

7、1 lpthreadlpthread注意:注意:包含线程的C程序在编译时加-lpthread参数中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程创建与终止线程创建与终止v线程线程IDID相关系统调用相关系统调用 #include pthread_t pthread_selfpthread_self(void);获得线程自身ID int pthread_equalpthread_equal(pthread_t tid1,pthread_t tid2);比较两个线程ID是否相等线程创建与终止线程创建与终止中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院v线程的终止线程的

8、终止n如果进程中的任一线程调用了exit,Exit或_exit,整个进程将会终止。n如果信号的默认动作是终止进程,那么把该信号发送到线程会终止整个进程n单个线程可以通过下列三种方式在不终止整个进程的情况下终止:1,线程只是从函数调用中返回;2,线程被同一进程中的其他线程调用pthread_cancel取消;3,线程调用pthread_exit终止;中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程创建与终止线程创建与终止#include #include void void pthread_exitpthread_exit(void (void * *rval_ptr)rval_

9、ptr); rval_ptrrval_ptr是一个无类型指针,与传递给是一个无类型指针,与传递给pthread_createpthread_create的单个参数类似。进程中的其他线程的单个参数类似。进程中的其他线程可以通过调用可以通过调用pthread_joinpthread_join函数访问到这个指针。函数访问到这个指针。 int int pthread_joinpthread_join(pthread_t thread,void (pthread_t thread,void * * *rval_ptrrval_ptr););调用这个函数的线程将一直被挂起,直到指定的线程调用这个函数的线程

10、将一直被挂起,直到指定的线程调用调用pthread_exitpthread_exit、或从函数执行完后返回或被取消。、或从函数执行完后返回或被取消。例:thread1.c thread1.c (LP P420) 取消线程 thread7.c (LP P436) 获得线程退出状态 exitstatus.c 中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程创建与终止线程创建与终止v初始化线程属性初始化线程属性#include #include void void pthread_attr_initpthread_attr_init( (pthread_attr_tpthread_a

11、ttr_t * *attr)attr) 该函数用于使用参数该函数用于使用参数attrattr中的属性来初始化线程属性。中的属性来初始化线程属性。该函数必须在该函数必须在pthread_create()pthread_create()函数之前被调用。函数之前被调用。typedef structtypedef structint _detachstate; /int _detachstate; /线程的分离状态;线程的分离状态;int _schedpolicy; /int _schedpolicy; /线程的调度策略;线程的调度策略;int _inheritsched; /int _inherit

12、sched; /线程属性的继承性线程属性的继承性int _scope; /int _scope; /线程作用域线程作用域int _stackaddr_set; int _stackaddr_set; size_t _guardsize;size_t _guardsize;void void * * _stackaddr; _stackaddr; pthread_attr_t;pthread_attr_t;线程创建与终止线程创建与终止v线程的分离状态线程的分离状态线程的分离状态决定了线程如何结束。线程的分离状态决定了线程如何结束。DETACHEDDETACHED:分离状态。处于分离状态的线程退出

13、时会释分离状态。处于分离状态的线程退出时会释放所占用的资源。放所占用的资源。JOINABLEJOINABLE:非分离状态(默认)。线程所属的进程没有非分离状态(默认)。线程所属的进程没有退出之前,不会释放线程所占用的资源。非分离状态退出之前,不会释放线程所占用的资源。非分离状态的线程可以通过调用的线程可以通过调用pthread_joinpthread_join函数等待其他线程函数等待其他线程结束,这样线程结束后会释放自己占用的资源。结束,这样线程结束后会释放自己占用的资源。pthread_attr_pthread_attr_setdetachstatesetdetachstate()()设置分

14、离状态属性函数设置分离状态属性函数pthread_attr_pthread_attr_getdetachstategetdetachstate()()获取分离状态属性函数获取分离状态属性函数中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程创建与终止线程创建与终止v设置和获得线程属性函数设置和获得线程属性函数pthread_attr_setscope()pthread_attr_setscope()pthread_attr_getscope()pthread_attr_getscope()pthread_attr_setinheritsched()pthread_attr_set

15、inheritsched()pthread_attr_getinheritsched()pthread_attr_getinheritsched()pthread_attr_setschedpolicy()pthread_attr_setschedpolicy()pthread_attr_getschedpolicy()pthread_attr_getschedpolicy()pthread_attr_setschedparam()pthread_attr_setschedparam()pthread_attr_getschedparam()pthread_attr_getschedparam

16、()例:设置分离状态 thread5.cthread5.c (LP P433)中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程创建与终止线程创建与终止v 信号量和互斥量信号量和互斥量n通过信号量和互斥量可以控制线程的通过信号量和互斥量可以控制线程的交叉执行交叉执行和和访问代访问代码临界区域码临界区域n信号量信号量是一个特殊类型的变量,可以被增加和减少,是一个特殊类型的变量,可以被增加和减少,linuxlinux保证对其的关键访问是原子操作。保证对其的关键访问是原子操作。#include #include int int sem_initsem_init(sem_t (sem_t

17、 * *sem,int pshared,unsigned int value)sem,int pshared,unsigned int value)初始化由初始化由semsem指向的信号量对象;指向的信号量对象;psharedpshared设置为设置为0 0表示是表示是当前进程的局当前进程的局部信号量部信号量,不在多个进程间共享不在多个进程间共享;valuevalue值为信号量初值,通常为值为信号量初值,通常为0 0; int int sem_waitsem_wait(sem_t (sem_t * *sem) /sem) /信号量值减信号量值减1 1int int sem_postsem_po

18、st(sem_t (sem_t * *sem) /sem) /信号量值加信号量值加1 1int int sem_destroysem_destroy(sem_t (sem_t * *sem) /sem) /销毁信号量销毁信号量例:全局变量控制线程切换效率低下。例:全局变量控制线程切换效率低下。 thread2.c thread2.c (LP P422) 例:信号量控制线程的同步。例:信号量控制线程的同步。thread3.c thread3.c (LP P424)线程的同步线程的同步中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院n 互斥量互斥量用用pthread_mutex_tpt

19、hread_mutex_t数据类型来表示。互斥量用数据类型来表示。互斥量用于锁住某个对象,控制每次只有一个线程能够访问互斥于锁住某个对象,控制每次只有一个线程能够访问互斥量保护的对象;量保护的对象;n 使用互斥量之前,必须首先通过把它设置为常量使用互斥量之前,必须首先通过把它设置为常量PTHREAD_MUTEX_INITIALIZERPTHREAD_MUTEX_INITIALIZER(静态分配的互斥量)或(静态分配的互斥量)或者通过调用者通过调用pthread_mutex_initpthread_mutex_init函数进行初始化。如果函数进行初始化。如果动态地分配互斥量(例如通过动态地分配互

20、斥量(例如通过mallocmalloc函数),那么在释函数),那么在释放内存前需要调用放内存前需要调用pthread_mutex_destroypthread_mutex_destroy函数销毁互函数销毁互斥量斥量例:信号量的局限 thread3a.c (LP P426)例:使用互斥量 thread4.c (LP P428)中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程的同步线程的同步v #include#include int int pthread_mutex_initpthread_mutex_init(prhtread_mutex_t (prhtread_mutex_

21、t * *restrict restrict mutexmutex,const pthread_mutexattr_t ,const pthread_mutexattr_t * *restrict restrict attrattr););要用默认的属性初始化互斥量,只需把要用默认的属性初始化互斥量,只需把attrattr设为设为NULLNULL。 int int pthread_mutex_destroypthread_mutex_destroy(pthread_mutex_t (pthread_mutex_t * *mutexmutex););n 对互斥量进行加锁和解锁对互斥量进行加锁和解

22、锁 int int pthread_mutex_lockpthread_mutex_lock(pthread_mutex_t (pthread_mutex_t * *mutex); mutex); /加锁加锁 int int pthread_mutex_trylockpthread_mutex_trylock(pthread_mutex_t (pthread_mutex_t * *mutex); mutex); /测试锁测试锁 int int pthread_mutex_unlockpthread_mutex_unlock(pthread_mutex_t (pthread_mutex_t *

23、*mutex); mutex); /解锁解锁中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程的同步线程的同步n 对互斥量进行加锁要调用对互斥量进行加锁要调用pthread_mutex_lockpthread_mutex_lock; ;如果如果互斥量已经上锁,则调用线程将阻塞直到互斥量被解互斥量已经上锁,则调用线程将阻塞直到互斥量被解锁。锁。对互斥量进行解锁要调用对互斥量进行解锁要调用pthread_mutex_unlockpthread_mutex_unlock; ;如果线程不希望被阻塞,可以使用如果线程不希望被阻塞,可以使用pthread_mutex_trylockpthre

24、ad_mutex_trylock尝试对互斥量进行加锁,如尝试对互斥量进行加锁,如果调用果调用pthread_mutex_trylockpthread_mutex_trylock时互斥量处于末锁住时互斥量处于末锁住状态,那么状态,那么pthread_mutex_trylockpthread_mutex_trylock将锁住互斥量,将锁住互斥量,不会出现阻塞并返回不会出现阻塞并返回0 0,否则,否则pthread_mutex_trylockpthread_mutex_trylock调用失败,不能锁住互斥量,返回调用失败,不能锁住互斥量,返回EBUSYEBUSY。例:使用互斥量保护数据结构 mute

25、x1.c中国地质大学(武汉)计算机学院中国地质大学(武汉)计算机学院线程的同步线程的同步v 如果线程试图对同一个互斥量加锁两次,它自身就会陷如果线程试图对同一个互斥量加锁两次,它自身就会陷入死锁状态。入死锁状态。v 使用互斥量时,其他更不明显的方式也能产生死锁,例使用互斥量时,其他更不明显的方式也能产生死锁,例如:程序中使用多个互斥量时,如果允许一个线程一直如:程序中使用多个互斥量时,如果允许一个线程一直占有一个互斥量,并且在试图锁住第二个互斥量时处于占有一个互斥量,并且在试图锁住第二个互斥量时处于阻塞状态,但占有第二个互斥量的线程也在试图锁住第阻塞状态,但占有第二个互斥量的线程也在试图锁住第

26、一个互斥量,这时就会发生死锁。一个互斥量,这时就会发生死锁。v死锁避免:死锁避免: 1 1,可以通过小心地控制互斥量加锁的顺序来避免死锁,可以通过小心地控制互斥量加锁的顺序来避免死锁的发生。的发生。 2 2,使用,使用pthread_mutex_trylockpthread_mutex_trylock避免死锁避免死锁。避免死锁避免死锁v 通过小心地控制互斥量加锁的顺序来避免死锁的发生。通过小心地控制互斥量加锁的顺序来避免死锁的发生。 所有线程按相同的顺序对互斥量进行加锁。只有在一个所有线程按相同的顺序对互斥量进行加锁。只有在一个线程试图以与另一个线程相反的顺序锁住互斥量时,才线程试图以与另一个线程相反的顺序锁住互斥量时,才可能出现死锁。可能出现死锁。v 使用使用pthread_mutex_trylockpthread_mutex_trylock避免死锁。避免死锁。 如果已经占有某些锁而且如果已经占有某些锁而且pthread_mutex_trylockpthread_mutex_trylock返回返回成功,线程才可以前进,如果成功,线程才可以前进,如果pthread_mutex_trylockpthread_mut

温馨提示

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

评论

0/150

提交评论