多线程编程5.ppt
上传人:qw****27 上传时间:2024-09-12 格式:PPT 页数:11 大小:87KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

多线程编程5.ppt

多线程编程5.ppt

预览

免费试读已结束,剩余 1 页请下载文档后查看

15 金币

下载此文档

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

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

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

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

第5章多线程编程1.线程概述进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较负责的上下文切换等动作。为了进一步减少上下文切换开销,进程在演变中出现了另一个概念——线程。它是一个进程内的基本调度单位,也可以称为轻量级进程。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。同进程一样,线程也将相关的变量值放在线程控制表中,一个进程可以有多个线程,也就是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。要注意的是,由于线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都会给其他线程带来影响。因此,线程中的同步就是非常重要的问题了。在多线程系统中,线程与进程的关系如下表所示。这里讲的线程相关操作都是用户空间线程的操作。在LINUX中,一般Pthread线程库是一套通用的线程库,是由POSIX提出的,因此具有很好的可移植性。1.线程创建和退出(1)函数说明创建函数实际上是确定调用该线程函数的入口点,这里通常使用的函数是pthread_create。在线程创建以后,就开始运行相关的线程函数,在该函数运行完了后,该线程也就退出了,这也是线程退出的一种方法。另一种退出线程的方法是使用函数pthread_exit,这是线程的主动行为。这里要注意的是,在使用线程函数时,不能随意使用exit退出函数进行出错处理,由于exit的作用是使调用进程终止,往往一个进程包含多个线程,因此,在使用exit之后,该进程中的所有线程都终止了。因此,在线程中就可以使用pthread_exit来代替进程中的exit。由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放。正如进程之间可以用wait()系统调用来同步终止并释放资源一样,线程之间也有类似机制,那就是pthread_join()函数,pthread_join可以用于将当前线程挂起,等待线程的结束。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源就被收回。(2)函数格式下表列出了pthread_create函数的语法要点。下表列出了pthread_exit函数的语法要点。5.2LINUX线程实现#include<stdio.h>#include<pthread.h>voidthread1(void){inti=0;for(i=0;i<6;i++){printf("Thisisapthread1.\n");if(i==2)pthread_exit(0);sleep(1);}}voidthread2(void){inti;for(i=0;i<3;i++)printf("Thisisapthread2.\n");pthread_exit(0);}intmain(void){pthread_tid1,id2;inti,ret;ret=pthread_create(&id1,NULL,(void*)thread1,NULL);if(ret!=0){printf("Createpthreaderror!\n");exit(1);}ret=pthread_create(&id2,NULL,(void*)thread2,NULL);if(ret!=0){printf("Createpthreaderror!\n");exit(1);}pthread_join(id1,NULL);pthread_join(id2,NULL);exit(0);}2.修改线程属性(1)函数说明大家还记得pthread_create函数的第二个参数——线程的属性。在上例中将该值设为NULL,也就是默认属性,线程有多个属性。这些属性主要包括绑定属性、分离属性、堆栈地址、堆栈大小、优先级。其中默认的属性为非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。绑定属性LINUX中采用“一对一”的线程机制,也就是一个用户线程对应一个内核线程。绑定属性就是一个用户线程固定的分配给一个内核线程,因为CPU时间片的调度是面向内核线程的,因此具有绑定属性的线程可以保证在需要的时候总有一个内核线程与之对应。而与之对应的非绑定属性就是指用户线程和内核线程的关系不是始终固定的,而是由系统来控制分配的。分离属性分离属性是用来决定一个线程以什么样的方式来终止自己。在非分离情况下,当一个线程结束时,它所占用的系统