如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
多线程编程2007-09-06BAIDUCONFIDENTIAL2005内容提要•多线程编程简介•POSIX多线程使用•Linux线程实现•多线程编程与调试BAIDUCONFIDENTIAL2005什么是多线程?•一个进程内部的多个可并发执行的任务实体。•多线程之间共享数据•抽象概念BAIDUCONFIDENTIAL2005为什么使用多线程?•提高系统的并发性–多cpu:多个线程在不同cpu上并发执行–单cpu:IO和cpu计算等的并行•提高程序的响应效率,特别是GUI程序•软件功能划分清晰BAIDUCONFIDENTIAL2005多线程而不是多进程?•线程相对与进程的优点–性能好。线程启动、切换的开销都小于进程,内存占用也小于进程–共享数据。线程间数据直接可见,进程间需要使用IPC机制–方便移植。遵循POSIX标准BAIDUCONFIDENTIAL2005POSIX线程•PortableOperatingSystemInterface•遵循IEEEPOSIX1003.1c-1995标准•定义了线程API和行为•业界支持最广泛–多种实现:LinuxThreads、NGPT、NPTL…–多种OS:Linux、Solaris、IRIX、AIX…–butWin32&OS/2BAIDUCONFIDENTIAL2005POSIX线程函数•POSIX线程函数提供以下几类功能:–线程的创建、终止、取消–线程属性控制–线程同步控制–线程专有数据的维护BAIDUCONFIDENTIAL2005线程创建•intpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);•启动一个新线程,线程执行体为start_routine函数•调用之后马上返回。创建成功返回0,失败则为非0BAIDUCONFIDENTIAL2005线程终止•线程执行体函数退出,线程就终止了•通过调用下面的函数退出:voidpthread_exit(void*retval);BAIDUCONFIDENTIAL2005线程分离状态•非分离状态(缺省)当该状态的线程正常执行退出时,并不释放自身占用资源(线程描述体、线程栈)需要其他线程执行如下函数来join该线程:intpthread_join(pthread_tth,void**thread_return);调用pthread_join()的线程阻塞直到待join的线程退出,并释放退出线程占用的资源。BAIDUCONFIDENTIAL2005线程分离状态(续)•分离状态线程执行退出,自动释放其占用的资源。可能的问题:线程在pthread_create()调用返回之前就退出,可能会导致返回错误的线程号。解决方法:线程开始时睡眠一小段时间BAIDUCONFIDENTIAL2005简单代码实例void*run(void*arg){intmain(intargc,charfor(;;)**argv){sleep(1);pthread_ttid;pthread_create(&tid,}NULL,run,NULL);pthread_join(tid,NULL);return0;}BAIDUCONFIDENTIAL2005常见问题:exit()出core•原因–按标准C的定义,exit函数需要把STDIO打开的句柄写buffer里的数据写下去,并释放打开的句柄–一个进程调用exit两次,其行为是未定义的。–我们可以认为exit不是一个线程安全的函数•解决方法–协调所有线程友好的退出–把exit()替换为向本进程发SIGKILLBAIDUCONFIDENTIAL2005线程同步•线程同步机制:–mutex,互斥锁–conditionvariable,条件变量–semaphore,信号量BAIDUCONFIDENTIAL2005锁(mutex)与临界区•共享变量操作需要临界区,使多个线程对共享变量的访问串行化•不是对所有的共享变量操作都需要临界区,那些有竞争条件(racecondition)的共享变量操作才需要临界区•锁是一种进程(线程)间同步的协议,锁这个概念(mutualexclusion)很好解决了临界区问题BAIDUCONFIDENTIAL2005mutex加锁和解锁•加锁