UNIX-LINUX环境多线程开发入门_第1页
UNIX-LINUX环境多线程开发入门_第2页
UNIX-LINUX环境多线程开发入门_第3页
UNIX-LINUX环境多线程开发入门_第4页
UNIX-LINUX环境多线程开发入门_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

UNIX/LINUX多线程开发入门杨永火yhyang@2011-11-27大纲线程的概念适用场景线程协作模型线程平安PthreadsAPI多线程管理使用互斥量使用条件变量多线程调试线程的概念〔一〕进程为程序在操作系统里的一次执行-进程的创立需要消耗较多资源进程ID,用户ID,组ID工作目录程序指令存放器,堆区,栈区,数据区文件描述符动态库环境变量….-是操作系统进行任务调度的一个根本实体-多进程可以实现多任务并发执行

线程的概念〔二〕线程为存在于进程内且可被操作系统独立调度的指令流实体轻量级进程,lightweightprocess可以以更小的代价实现多任务并发线程共享进程资源仅维护可独立调度所需的信息:栈区存放器线程私有的数据调度属性〔策略和优先级〕等待或挂起的信号进程消亡,那么线程也消亡对于共享资源使用需要同步从开发人员角度,可以把多线程想像成具有多个”main”函数的程序适用场景〔一〕多线程使用轻量级方式处理多任务并发问题核心概念是任务需要可并发执行,同时机器应为多处理器和多核处理器适用场景〔二〕根据2/8原理,80%的cpu只消耗在20%的代码上如果这20%的代码可以做并发,那么可使用多线程大幅度提升性能多线程相比多进程或单进程需要更多的编程技巧把整个程序设计成多线程会使开发效率降低,出错概率增加建议只在20%的性能瓶颈局部代码做多线程化可多线程典型任务: -数据或任务可以分片并发执行(flastGet)-I/O等待时间很长的(Oracle的大查询)-某些局部CPU密集型,其它局部那么不是线程协作模型典型的线程间协作模型-老板/工人模型:主线程〔老板〕打包任务,放进任务列表,子线程〔工人〕从任务列表提取任务,执行任务;可以使用静态子线程池,也可以使用动态的子线程池。-流水线模型:每个任务被分为几个子阶段,每个任务在各个子阶段间串行执行,但是每个子阶段可以使用多个线程并发执行-伙伴模型:跟老板/工人模型类似,只是主线程在打包完任务后也参与到任务的执行线程平安〔一〕所有线程共享进程的全局资源,程序员需要负责保证对共享数据的同步访问线程平安〔二〕从每个线程的”main”函数开始调用的一系列函数都必须是线程平安的函数,包括库函数在未确定某个库支持多线程的情况下,需假定该库不支持多线程,使用“顺序”方式使用该库的函数PthreadsAPI〔一〕历史上,计算机软硬件厂商都开发了各自私有的多线程实现开发可移植的多线程程序非常困难IEEE于1995年完成编程接口的标准化,POSIX1003.1cstandard遵循该标准的多线程实现称为POSIXthreads或Pthreads.Pthreads是一组C语言数据类型和库函数的集合,编译时包含pthread.h头文件,链接时包含-lpthread选项即可。PthreadsAPI〔二〕总共有100多个API,仅介绍最实用的3类API:-线程管理:创立行程,终止线程,别离线程,等待线程,线程属性的设置与查询-互斥变量:mutex--mutualexclusion简写,创立/销毁互斥变量,对互斥变量进行加解锁-条件变量:解决线程间需要基于特定的条件进行互相通知的问题,创立和销毁条件变量,基于特定值等待某个条件变量,通知某个条件变量Pthreads库所有函数和数据类型都以pthread_打头线程管理〔一〕创立和终止线程,程序启动时默认为单个主线程pthread_create(thread,attr,start_routine,arg)pthread_exit(status)pthread_cancel(thread)线程终止情况:-线程的“main”函数正常结束-线程调用pthread_exit函数退出-被其他线程以pthread_cancel方式取消了-整个进程终止了,如主线程调用exit()/exec()-主线程main函数结束,未调用pthread_exit线程管理〔二〕线程创立后,线程间都是对等的,任何线程都可以创立其他线程,并无任何特定的关系。例如ex_create.cppex_create_class.cppex_create_args.cppex_create_args_ok.cpp线程管理〔三〕线程有默认属性,可以通过属性对象设置线程属性pthread_attr_init(attr)pthread_attr_destroy(attr)可以使用属性查询API查询线程属性-别离或可等待状态-堆栈大小-堆栈地址-调度策略…线程管理〔四〕Join方法是线程间同步的一种方式:pthread_join(threadid,status)pthread_detach(threadid)pthread_attr_setdetachstate(attr,detachstate)pthread_attr_getdetachstate(attr,detachstate)线程管理〔五〕为了可移植性,最好显式申明线程是Joinable的如果确定线程不需要被Join,那么申明为Detached可以节省系统资源例如ex_join.cpp线程管理〔六〕栈的管理pthread_attr_getstacksize(attr,stacksize)pthread_attr_setstacksize(attr,stacksize)为了程序的可移植性,可以指定堆栈大小,防止不同机器的配置不同导致栈溢出pthread_self()可以查询线程的id号例如ex_stack.cpp使用互斥量〔一〕Balance+=200Balance+=200+=在操作系统是执行时是多个指令,并非原子型的操作使用互斥量〔二〕多个线程对全局共享变量的“写”操作,需用使用互斥量来进行保护在任何时间,只能有一个线程可以对一个互斥变量进行加锁,对该互斥变量进行加锁的其他线程被阻塞,直到那个变量被解锁才有时机对其加上锁。这样保证了线程必须“顺序”使用被保护的数据。使用互斥量〔三〕对一个共享变量使用mutex保护是一个“君子协定”,必须由程序员来保证Thread1Thread2Thread3LockLockA=2A=A+1A=A*BUnlockUnlock使用互斥量〔四〕创立和摧毁互斥变量pthread_mutex_init(mutex,attr)pthread_mutex_destroy(mutex)pthread_mutexattr_init(attr)pthread_mutexattr_destroy(attr)对互斥变量进行加解锁pthread_mutex_lock(mutex)pthread_mutex_trylock(mutex)pthread_mutex_unlock(mutex)例如ex_mutex.cpp使用条件变量〔一〕互斥变量可以实现对一个共享数据的独占性访问,条件变量可以实现基于某个特定数值的停等-通知同步没有条件变量,程序员可用使用轮询某个变量来实现停等-通知同步,但是非常消耗系统资源条件变量可以使线程处于等待状态而不消耗资源使用条件变量〔二〕条件变量必须跟一个互斥变量一起使用,因为条件变量就是共享的全局数据创立和销毁条件变量pthread_cond_init(condition,attr)pthread_cond_destroy(condition)pthread_condattr_init(attr)pthread_condattr_destroy(attr)使用条件变量〔三〕等待条件变量或给条件变量发信号pthread_cond_wait(condition,mutex)pthread_cond_signal(condition)pthread_cond_broadcast(condition)例如ex_cond.cpp多线程调试带线程编号记日志退化成单线程程序,确定是多线程问题pstack查看各个线程堆栈情况ps-eLf查看线程数量gdb调试多线程,infothreads/thread4总结一下多个线程由于共享进程资源,从而提供一种轻量级的并发执行任务的方式线程创立后执行顺序是任意的,必须对共享资源“写”操作使用互斥变量进行加解锁,以到达“顺序”使用资源的目的从线程

温馨提示

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

评论

0/150

提交评论