



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux系统下实现多线程客户/服务器在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理。Unix下的大多数网络服务器程序都是这么编写的,即父进程接受连接,派生子进程,子进程处理与客户的交互。虽然这种模型很多年来使用得很好,但是fork时有一些问题:1. fork是昂贵的。内存映像要从父进程拷贝到子进程,所有描述字要在子进程中复制等等。目前有的Unix实现使用一种叫做写时拷贝(copy-on-write)的技术,可避免父进程数据空间向子进程的拷贝。尽管有这种优化技术,fork仍然是昂贵的。2. fork子进程后,需要用进程间通信
2、(IPC)在父子进程之间传递信息。Fork之前的信息容易传递,因为子进程从一开始就有父进程数据空间及所有描述字的拷贝。但是从子进程返回信息给父进程需要做更多的工作。线程有助于解决这两个问题。线程有时被称为轻权进程(lightweightprocess),因为线程比进程“轻权”,一般来说,创建一个线程要比创建一个进程快10100倍。一个进程中的所有线程共享相同的全局内存,这使得线程很容易共享信息,但是这种简易性也带来了同步问题。一个进程中的所有线程不仅共享全局变量,而且共享:进程指令、大多数数据、打开的文件(如描述字)、信号处理程序和信号处置、当前工作目录、用户ID和组ID。但是每个线程有自己的
3、线程ID、寄存器集合(包括程序计数器和栈指针)、栈(用于存放局部变量和返回地址)、error、信号掩码、优先级。在Linux中线程编程符合Posix.1标准,称为Pthreads。所有的pthread函数都以pthread_开头。以下先讲述5个基本线程函数,在调用它们前均要包括pthread.h头文件。然后再给出用它们编写的一个TCP客户/服务器程序例子。第一个函数:intpthread_create(pthread_t*tid,constpthread_attr_t*attr,void*(*func)(void*),void*arg);一个进程中的每个线程都由一个线程IDtthreadID)
4、标识,其数据类型是pthread_t(常常是unsignedint)。如果新的线程创建成功,其ID将通过tid指针返回。每个线程都有很多属性:优先级、起始栈大小、是否应该是一个守护线程等等,当创建线程时,我们可通过初始化一个pthread_attr_t变量说明这些属性以覆盖缺省值。我们通常使用缺省值,在这种情况下,我们将attr参数说明为空指针。最后,当创建一个线程时,我们要说明一个它将执行的函数。线程以调用该函数开始,然后或者显式地终止(调用pthread_exit)或者隐式地终止(让该函数返回)。函数的地址由func参数指定,该函数的调用参数是一个指针arg,如果我们需要多个调用参数,我们
5、必须将它们打包成一个结构,然后将其地址当作唯一的参数传递给起始函数。在func和arg的声明中,func函数取一个通用指针(void*)参数,并返回一个通用指针(void*),这就使得我们可以传递一个指针(指向任何我们想要指向的东西)给线程,由线程返回一个指针(同样指向任何我们想要指向的东西)。调用成功,返回0,出错时返回正Exxx值。Pthread函数不设置errno。第二个函数:intpthread_join(pthread_ttid,void*status);该函数等待一个线程终止。把线程和进程相比,pthread_creat类似于fork,而pthread_join类似于waitpid
6、。我们必须要等待线程的tid,很可惜,我们没有办法等待任意一个线程结束。如果status指针非空,线程的返回值(一个指向某个对象的指针)将存放在status指向的位置。第三个函数:pthreadtpthreadself(void);线程都有一个ID以在给定的进程内标识自己。线程ID由pthread_creat返回,我们可以pthread_self取得自己的线程ID。第四个函数:intpthread_detach(pthread_ttid);线程或者是可汇合的(joinable)或者是脱离的(detached)。当可汇合的线程终止时,其线程ID和退出状态将保留,直到另外一个线程调用pthread
7、_join。脱离的线程则像守护进程:当它终止时,所有的资源都释放,我们不能等待它终止。如果一个线程需要知道另一个线程什么时候终止,最好保留第二个线程的可汇合性。Pthread_detach函数将指定的线程变为脱离的。该函数通常被想脱离自己的线程调用,如:pthread_detach(pthread_self();第五个函数:voidpthreadexit(void*status);该函数终止线程。如果线程未脱离,其线程ID和退出状态将一直保留到调用进程中的某个其他线程调用pthread_join函数。指针status不能指向局部于调用线程的对象,因为线程终止时这些对象也消失。有两种其他方法可使
8、线程终止:1 .启动线程的函数(pthread_creat的第3个参数)返回。既然该函数必须说明为返回一个void指针,该返回值便是线程的终止状态。2.如果进程的main函数返回或者任何线程调用了exit,进程将终止,线程将随之终止。以下给出一个使用线程的TCP回射客户/服务器的例子,完成的功能是客户端使用线程给服务器发从标准输入得到的字符,并在主线程中将从服务器端返回的字符显示到标准输出,服务器端将客户端发来的数据原样返回给客户端,每一个客户在服务器上对应一个线程。利用该程序框架,通过扩展客户端和服务器端的处理功能,可以完成多种基于多线程的客户机/服务器程序。该程序在RedHat6.0和Tu
9、rboLinux4.02下调试通过。共用头文件如下:(head.h)# include# include# include# include# include# include# include# include# include# include# includeddefineMAXLINE1024# defineSERV_PORT8000ddefineLISTENQ1024staticintsockfd;staticFILE*fp;公用函数如下(common.c)/*从一个描述字读文本行*/ssize_treadline(intfd,void*vptr,size_tmaxlen)ssize
10、_tn,rc;charc,*ptr;for(n=1;n0)if(nwritten=write(fd,ptr,nleft)0)# -fputs(recvline,stdout);)intmain(intargc,char*argv)intsockfd;structsockaddr_inservaddr;if(argc!=2)printf(usage:tcpcli);exit(0);bzero(&servaddr,sizeof(servaddr);servaddr.sin_family=AF_INET;servaddr.sinport=htons(SERV_PORT);inet_pton(
11、AF_INET,argv1,&servaddr.sin_addr);connect(sockfd,(structsockaddr*)&servaddr,siziof(servaddr);str_cli(stdin,sockfd);exit(0);)服务器端主程序如下:# includehead.h;# include“common.c;voidstr_echo(intsockfd).ssize_tn;charlineMAXLINE;for(;)if(n=readline(sockfd,line,MAXLINE)=0)return;writen(sockfd,line,n);)s
12、taticvoid*doit(void*arg)pthread_detach(pthread_self();str_echo(int)arg);close(int)arg);return(NULL);)intmain(intargc,char*argv)intlistenfd,connfd;socklen_taddrlen,len;structsockaddr_incliaddr,servaddr;pthread_ttid;listenfd=socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr);servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=SERV_PORT;bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr);listen(list
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国民航大学《公路施工技术与管理》2023-2024学年第二学期期末试卷
- 定西职业技术学院《司法文书写作与法律文献检索》2023-2024学年第二学期期末试卷
- 北京经贸职业学院《专业考察(设计公司、实训基地)》2023-2024学年第二学期期末试卷
- 贵州应用技术职业学院《油气成藏理论》2023-2024学年第二学期期末试卷
- 湖南工业职业技术学院《信息与计算科学专业导论》2023-2024学年第二学期期末试卷
- 植物景观设计考察专题研究
- 天津科技大学《财务会计二》2023-2024学年第二学期期末试卷
- 威海海洋职业学院《给排水概论》2023-2024学年第二学期期末试卷
- 昆明医科大学海源学院《电子商务管理实务》2023-2024学年第二学期期末试卷
- 重庆电子工程职业学院《临床医学整合案例》2023-2024学年第二学期期末试卷
- 投资合同:有限公司投资协议
- 四川大学华西口腔医院临床研究医学伦理审查申请表【模板】
- 锅炉安装改造维修质量保证体系文件(手册+程序文件+表格+工艺文件汇编)-符合TSG 07-2019特种设备质量保证管理体系
- 急性呼吸窘迫综合征-课件
- 拖欠房租通知书范文
- 年产万吨的氯乙烯合成工段的工艺设计
- 2024年湖北省中考历史试卷附答案
- 燃气经营安全重大隐患判定标准课件
- 民法典之合同篇课件
- 2024年福建省莆田市初中八年级教学质量检测生物试卷
- 2024江苏省烟草专卖局(公司)系统员工招聘笔试参考题库含答案解析
评论
0/150
提交评论