线程管理课件

上传人:re****.1 文档编号:593426153 上传时间:2024-09-24 格式:PPT 页数:38 大小:112.50KB
返回 下载 相关 举报
线程管理课件_第1页
第1页 / 共38页
线程管理课件_第2页
第2页 / 共38页
线程管理课件_第3页
第3页 / 共38页
线程管理课件_第4页
第4页 / 共38页
线程管理课件_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《线程管理课件》由会员分享,可在线阅读,更多相关《线程管理课件(38页珍藏版)》请在金锄头文库上搜索。

1、多线程编程1线程管理线程概述线程的基本操作线程同步互斥2线程管理每个进程都拥有自己的数据段、代码段和堆栈段,这就造成进程在进行创建、切换、撤销操作时,需要较大的系统开销。为了减少系统开销,从进程中演化出了线程。线程存在于进程中,共享进程的资源。线程是进程中的独立控制流,由环境(包括寄存器组和程序计数器)和一系列的执行指令组成。3线程管理线程的概念每个进程有一个地址空间和一个控制线程。4线程管理线程和进程的比较调度线程是CPU调度和分派的基本单位。拥有资源:进程是系统中程序执行和资源分配的基本单位。线程自己一般不拥有资源(除了必不可少的程序计数器,一组寄存器和栈),但它可以去访问其所属进程的资源

2、,如进程代码段,数据段以及系统资源(已打开的文件,I/O设备等)。5线程管理系统开销同一个进程中的多个线程可共享同一地址空间,因此它们之间的同步和通信的实现也变得比较容易。在进程切换时候,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置;而线程切换只需要保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作,从而能更有效地使用系统资源和提高系统的吞吐量。并发性不仅进程间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行。6线程管理使用多线程的目的主要有以下几点:多任务程序的设计一个程序可能要处理不同应用,要处理多种任务,如果开发不同的进程来处理,系统开销很大

3、,数据共享,程序结构都不方便,这时可使用多线程编程方法。并发程序设计一个任务可能分成不同的步骤去完成,这些不同的步骤之间可能是松散耦合,可能通过线程的互斥,同步并发完成。这样可以为不同的任务步骤建立线程。7线程管理网络程序设计为提高网络的利用效率,我们可能使用多线程,对每个连接用一个线程去处理。数据共享同一个进程中的不同线程共享进程的数据空间,方便不同线程间的数据共享。在多CPU系统中,实现真正的并行。8线程管理线程的基本操作就像每个进程都有一个进程号一样,每个线程也有一个线程号。进程号在整个系统中是唯一的,但线程号不同,线程号只在它所属的进程环境中有效。进程号用pid_t数据类型表示,是一个

4、非负整数。线程号则用pthread_t数据类型来表示。有的系统在实现pthread_t的时候,用一个结构体来表示,所以在可移植的操作系统实现不能把它做为整数处理。9线程管理#include int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);功能:创建一个线程。10线程管理参数:thread:线程标识符地址。attr:线程属性结构体地址。start_routine:线程函数的入口地址。arg:传给线程函数的参数。返回值:成功:返回0。失

5、败:返回非0。11线程管理与fork不同的是pthread_create创建的线程不与父线程在同一点开始运行,而是从指定的函数开始运行,该函数运行完后,该线程也就退出了。线程依赖进程存在的,如果创建线程的进程结束了,线程也就结束了。线程函数的程序在pthread库中,故链接时要加上参数-lpthread。例:01_pthread_create_1.c 01_pthread_create_2.c12线程管理#include int pthread_join(pthread_t thread, void *retval);功能:等待子线程结束,并回收子线程资源。参数:thread:被等待的线程号。

6、retval:用来存储线程退出状态的指针的地址。返回值:成功返回0,失败返回非0。例:02_pthread_join.c13线程管理创建一个线程后应回收其资源,但使用pthread_join函数会使调用者阻塞,故Linux提供了线程分离函数:pthread_detach。14线程管理#include int pthread_detach(pthread_t thread);功能:使调用线程与当前进程分离,使其成为一个独立的线程,该线程终止时,系统将自动回收它的资源。参数:thread:线程号返回值:成功:返回0,失败返回非0。例:03_pthread_detach.c15线程管理在进程中我们可

7、以调用exit函数或_exit函数来结束进程,在一个线程中我们可以通过以下三种在不终止整个进程的情况下停止它的控制流。线程从执行函数中返回。线程调用pthread_exit退出线程。线程可以被同一进程中的其它线程取消。16线程管理#include void pthread_exit(void *retval);功能:退出调用线程。参数:retval:存储线程退出状态的指针。注:一个进程中的多个线程是共享该进程的数据段,因此,通常线程退出后所占用的资源并不会释放。例:04_pthread_exit.c17线程管理取消线程是指取消一个正在执行线程的操作。#include int pthread_c

8、ancel(pthread_t thread);功能:取消线程。参数:thread:目标线程ID。返回值:成功返回0,失败返回出错编号。18线程管理pthread_cancel函数的实质是发信号给目标线程thread,使目标线程退出。此函数只是发送终止信号给目标线程,不会等待取消目标线程执行完才返回。然而发送成功并不意味着目标线程一定就会终止,线程被取消时,线程的取消属性会决定线程能否被取消以及何时被取消。线程的取消状态线程取消点线程的取消类型19线程管理线程的同步互斥同步:两个或两个以上的线程在运行过程中协同步调,按预定的先后次序运行。互斥:一个公共资源同一时刻只能被一个线程使用,多个线程不

9、能同时使用公共资源。POSIX标准中线程同步和互斥的方法,主要有信号量和互斥锁两种方式。20线程管理互斥锁(mutex)mutex是一种简单的加锁的方法来控制对共享资源的访问,mutex只有两种状态,即上锁(lock)和解锁(unlock)。在访问该资源前,首先应申请mutex,如果mutex处于unlock状态,则会申请到mutex并立即lock;如果mutex处于lock状态,则默认阻塞申请者。unlock操作应该由lock者进行。21线程管理mutex用pthread_mutex_t数据类型表示,在使用互斥锁前,必须先对它进行初始化。静态分配的互斥锁:pthread_mutex_t mu

10、tex = PTHREAD_MUTEX_INITIALIZER;动态分配互斥锁:pthread_mutex_t mutex;pthread_mutex_init(&mutex, NULL);在所有使用过此互斥锁的线程都不再需要使用时候,应调用pthread_mutex_destroy销毁互斥锁。22线程管理#include int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);功能:初始化一个互斥锁。参数:mutex:互斥锁地址。attr:互斥锁的属性,NULL为默认的属性。返回值:成功返回

11、0,失败返回非0。23线程管理#include int pthread_mutex_lock(pthread_mutex_t *mutex);功能:对互斥锁上锁,若已经上锁,则调用者一直阻塞到互斥锁解锁。参数:mutex:互斥锁地址。返回值:成功返回0,失败返回非0。24线程管理#include int pthread_mutex_trylock(pthread_mutex_t *mutex);功能:对互斥锁上锁,若已经上锁,则上锁失败,函数立即返回。参数:mutex:互斥锁地址。返回值:成功返回0,失败返回非0。25线程管理#include int pthread_mutex_unlock(

12、pthread_mutex_t * mutex);功能:对指定的互斥锁解锁。参数:mutex:互斥锁地址。返回值:成功返回0,失败返回非0。26线程管理#include int pthread_mutex_destroy(pthread_mutex_t *mutex);功能:销毁指定的一个互斥锁。参数:mutex:互斥锁地址。返回值:成功返回0,失败返回非0。例:07_pthread_mutex.c27线程管理信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于时

13、,则可以访问,否则将阻塞。28线程管理原语是对信号量的操作,一次操作使信号量sem减,一次操作使信号量sem加。信号量主要用于进程或线程间的同步和互斥这两种典型情况。若用于互斥,几个进程(或线程)往往只设置一个信号量。若用于同步操作,往往会设置多个信号量,并且安排不同的初始值,来实现它们之间的执行顺序。29线程管理信号用于互斥30线程管理信号量用于同步31线程管理#include int sem_init(sem_t *sem, int pshared,unsigned int value);功能:创建一个信号量并初始化它的值。参数:sem:信号量的地址。pshared:等于0,信号量在线程间

14、共享;不等于0,信号量在进程间共享。value:信号量的初始值。返回值:成功返回0,失败返回-1。32线程管理#include int sem_wait(sem_t *sem);功能:将信号量的值减1,若信号量的值小于0,此函数会引起调用者阻塞。参数:sem:信号量地址。返回值:成功返回0,失败返回-1。33线程管理#include int sem_trywait(sem_t *sem);功能:将信号量的值减1,若信号量的值小于0,则对信号量的操作失败,函数立即返回。参数:sem:信号量地址。返回值:成功返回0,失败返回-1。34线程管理#include int sem_post(sem_t

15、*sem);功能:将信号量的值加1并发出信号唤醒等待线程。参数:sem:信号量地址。返回值:成功返回0,失败返回-1。35线程管理#include int sem_getvalue(sem_t *sem, int *sval);功能:获取sem标识的信号量的值,保存在sval中。参数:sem:信号量地址。sval:保存信号量值的地址。返回值:成功返回0,失败返回-1。36线程管理#include int sem_destroy(sem_t *sem);功能:删除sem标识的信号量。参数:sem:信号量地址。返回值:成功返回0,失败返回-1。例:08_semphore_1.c 08_semphore_2.c37线程管理练习生产者消费者:有一个仓库,生产者负责生产产品,并放入仓库,消费者会从仓库中拿走产品(消费)。要求:仓库中每次只能入一人(生产者或消费者)。仓库中可存放产品的数量最多10个,当仓库放满时,生产者不能再放入产品。当仓库空时,消费者不能从中取出产品。生产、消费速度不同。38线程管理

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号