linux多线程编程.ppt_第1页
linux多线程编程.ppt_第2页
linux多线程编程.ppt_第3页
linux多线程编程.ppt_第4页
linux多线程编程.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

linux多线程编程,Linux下线程概述linux线程实现,1、Linux下线程概述,进程是系统中程序执行和资源分配的基本单位。每个进程有自己的数据段、代码段和堆栈段。线程通常叫做轻型的进程。线程是在共享内存空间中并发执行的多道执行路径,他们共享一个进程的资源。因为线程和进程比起来很小,所以相对来说,线程花费更少的CPU资源。,图1进程与线程的关系,线程按照其调度者可分为用户级线程和内核级线程两种。(1)用户级线程主要解决的是上下文切换的问题,其调度算法和调度过程全部有用户决定。(2)内核级线程有内核调度机制实现。现在大多数操作系统都采用用户级线程和内核级线程并存的方法。用户级线程可与内核级线程实现“一对一”,“一对多”的对应关系。,2、linux线程实现,以下线程均为用户级线程。在linux中,一般采用Pthread线程库实现线程的访问与控制,由POSIX提出,具有良好的可移植性。,2.1线程创建与退出,创建线程使用pthread_create函数。在线程创建以后,就开始运行相关的线程函数。线程退出时使用函数pthread_exit,是线程的主动行为。注意进程退出时使用exit函数,线程中用pthread_exit替代exit。由于一个进程中的多个线程共享数据段,因此通常在线程退出后,退出线程所占用的资源并不会随线程结束而释放。所有需要pthread_join函数来等待线程结束,类似于wait系统调用。,创建进程:#includepthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg)thread:线程标识符attr:线程属性设置start_routine:线程函数起始地址arg:传递给start_routine的参数,进程退出:#includepthread_exit(void*retval)retval:pthread_exit调用者线程的返回值,可由其他函数和pthread_join来检测获取。,等待进程退出:#includepthread_join(pthread_t*th,void*thread_return)th:等待线程的标识符thread_return:用户定义指针,用来存储被等待线程的返回值线程实例见:thread.c,2.2修改线程属性,在thread_creat函数中有设置线程属性参数,这些属性包括绑定属性、分离属性、堆栈地址、堆栈大小、优先级。系统默认属性为非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。分别介绍绑定属性和分离属性。,1、绑定属性在linux系统中,可实现一个用户级线程与一个内核级线程相对应的“一对一”线程机制。绑定属性是指一个用户级线程固定的分配给一个内核级线程。非绑定属性则是指用户级线程与内核级线程的关系不是始终固定的,而是由系统来控制分配。,2、分离属性分离属性是用来决定一个线程以什么样的方式来终止自己。在非分离情况下,当一个线程结束时,它所占用的系统资源并没有完全释放,也没有真正终止。只有当pthread_join()函数返回时,该线程才释放自己占用的资源。而在分离情况下,一个线程结束时会立即释放它所占用的资源。,3、属性设置属性设置是由一定函数来完成的,通常调用pthread_attr_init函数进行初始化。设置绑定属性的函数为pthread_attr_setscope,设置分离属性的函数是pthread_attr_setdetachstate,设置线程优先级的相关函数pthread_attr_getschdparm(获取线程优先级)和pthread_attr_setschedparam(设置线程优先级)。在设置完成属性后,调用pthread_creat函数创建线程。,线程属性初始化:#includeintpthread_attr_init(pthread_attr_t*attr)attr:线程属性返回值:成功0,错误-1。,设置绑定属性:#includepthread_attr_setscope(pthread_attr_t*attr,initscope)attr:线程属性scope:PTHREAD_SCOPE_SYSTEM(绑定)PTHREAD_SCOPE_PRCESS(非绑定)返回值:成功0,错误-1。,设置分离属性:#includepthread_attr_setsetdetachstate(pthread_attr_t*attr,initdetachstate)attr:线程属性detachstate:PTHREAD_CREAT_DETACHED(分离)PTHREAD_CREAT_JOINABLE(非分离)返回值:成功0,错误-1。,获取线程优先级:#includeintpthread_attr_getschedparam(pthread_attr_attr*attr,structsched_param*param)attr:线程属性param:线程优先级返回值:成功0,错误-1。,设置线程优先级:#includeintpthread_attr_setschedparam(pthread_attr_attr*attr,structsched_param*param)attr:线程属性param:线程优先级返回值:成功0,错误-1。线程实例见:pthread.c,2.3mutex互斥锁线程控制,mutex是一种简单的加锁的方法来控制对共享资源的访问。在同一时刻只能有一个线程掌握某个互斥上的锁,拥有上锁状态的线程能够对共享资源进行访问。若其他线程希望上锁一个已经被上了互斥锁的资源,则该线程挂起,直到上锁的线程释放互斥锁为止。,互斥锁的操作主要包括以下几个步骤:互斥锁初始化:pthread_mutex_init互斥锁上锁:pthread_mutex_lock互斥锁判断上锁:pthread_mutex_trylock互斥锁解锁:pthread_mutex_unlock消除互斥锁:pthread_mutex_destroy,互斥锁可分为以下三种:快速互斥锁:递归互斥锁:检错互斥锁:这三种锁的主要区别在于其他未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待。快速互斥锁是指调用线程会阻塞直到拥有互斥锁的线程释放为止。递归互斥锁能够成功返回并且增加调用线程在互斥上加锁的次数。检错互斥锁则为快速互斥锁的阻塞版本,他会立即返回并得到一个错误。,互斥锁初始化:#includeintpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutex_attr_t*mutexattr)Mutex:互斥锁Mutexattr:PTHREAD_MUTEX_INITIALIZER:创建快速互斥锁PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁PTHREAD_REEORCHECK_MUTEX_INITIALIZER_NP:创建检错互斥锁,互斥锁操作:#includeintpthread_mutex_lock(pthread_mutex_t*mutex)intpthread_mutex_trylock(pthread_mutex_t*mutex)intpthread_mutex_unlock(pthread_mutex_t*mutex)intpthread_mutex_destroy(pthread_mutex_t*mutex)Mutex:互斥锁返回值:成功0,错误-1。互斥锁实例见:mutex.c,2.4信号量线程控制,信号量也就是操作系统中所用到的PV操作,它广泛用于进程或线程间的互斥与同步。PV操作是对整数计数器信号量sem的操作。一次P操作使sem减一,一次V操作使sem加一。用于互斥时,几个进程(或线程)往往只设置一个信号量sem。用于同步时,往往设置多个信号量,并安排不同的值了来实现它们之间的顺序执行。,Linux实现了POSIX.1的无名信号量,用于线程的同步与互斥。信号量操作函数:sem_init:用于创建一个信号量,并初始化它。sem_wait或se

温馨提示

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

评论

0/150

提交评论