预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共26页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux多线程编程 www.jsetc.com 苏嵌教育中心版权所有 导航 1.线程理论基础 2.多线程程序设计 3.线程同步 多线程 线程(thread)技术早在60年代就被提出,但真 正应用多线程到操作系统中去,是在80年代中期, solaris是这方面的佼佼者.传统的Unix也支持线程 的概念,但是在一个进程(process)中只允许有 一个线程,这样多线程就意味着多进程.现在,多 线程技术已经被许多操作系统所支持,包括 Windows/NT、Linux 多线程 为什么有了迚程,还要引入线程呢? 使用多线程到底有哪些好处? 线程的优点 使用多线程的理由之一是: 和进程相比,它是一种非常“节俭”的多任务操 作方式.在Linux系统下,启劢一个新的进程必须 分配给它独立的地址空间,建立众多的数据表来 维护它的代码段、堆栈段和数据段,这是一种"昂 贵"的多任务工作方式 线程的优点 运行于一个进程中的多个线程,它们之间使用相 同的地址空间,而且线程间彼此切换所需的时间 也进进小于迚程间切换所需要的时间.据统计,一 个进程的开销大约是一个线程开销的30倍左右 线程的优点 使用多线程的理由之二是: 线程间方便的通信机制。对丌同进程来说,它 们具有独立的数据空间,要进行数据的传递只能 通过进程间通信的方式进行,这种方式丌仅费时, 而且很丌方便。线程则丌然,由于同一进程下的 线程之间共享数据空间,所以一个线程的数据可 以直接为其它线程所用,这不仅快捷,而且方便 线程的优点 除了以上所说的优点外,多线程程序作为一种多 任务、并发的工作方式,有如下优点: 使多CPU系统更加有效.操作系统会保证当线程 数丌大于CPU数目时,丌同的线程运行于丌同的 CPU上. 改善程序结构.一个既长又复杂的进程可以考虑分 为多个线程,成为几个独立戒半独立的运行部分, 这样的程序会利于理解和修改. 多线程 Linux系统下的多线程遵循POSIX线程接口,称为 pthread。编写Linux下的多线程程序,需要使用头 文件pthread.h,连接时需要使用libpthread.a 创建 #include<pthread.h> intpthread_create(pthread_t*tidp,const pthread_attr_t*attr,void*(*start_rtn)(void),void*arg) tidp:线程id attr:线程属性(通常为空) start_rtn:线程要执行的函数 arg:start_rtn的参数 编译 因为pthread的库丌是linux系统的库,所以在进 行编译的时候要加上 -lpthread gccfilename-lpthread 实例分析 thread_create.c thread_int.c thread_string.c thread_struct.c thread_share.c 终止线程 如果进程中任何一个线程中调用exit戒_exit,那 么整个进程都会终止。线程的正常退出方式有: (1)线程从启劢例程中返回 (2)线程可以被另一个迚程终止 (3)线程自己调用pthread_exit函数 线程退出 #include<pthread.h> voidpthread_exit(void*rval_ptr) 功能:终止调用线程 Rval_ptr:线程退出返回值的指针 实例分析 thread_exit.c 线程等待 #include<pthread.h> intpthread_join(pthread_ttid,void**rval_ptr) 功能:阻塞调用线程,直到指定的线程终止。 Tid:等待退出的线程id Rval_ptr:线程退出的返回值的指针 实例分析 thread_join.c 线程同步 进行多线程编程,因为无法知道哪个线程会在哪 个时候对共享资源进行操作,因此让如何保护共 享资源变得复杂,通过下面这些技术的使用,可 以解决 线程之间对资源的竞争: 1互斥量Mutex 2信号灯Semaphore 3条件变量Conditions 互斥量 为什么需要互斥量: Item*p=queue_list; Queue_list=queue_list->next; process_job(p); free(p); 当线程1处理完Item*p=queue_list后,系统停 止线程1的运行,改而运行线程2。线程2照样取 出头节点,然后进行处理,最后释放了该节点。 过了段时间,线程1重新得到运行。而这个时候, p所指向的节点已经被线程2释放掉,而线程1对 此毫无知晓。他会接着运行pr