- 浏览: 323454 次
- 性别:
- 来自: 温州
文章分类
最新评论
-
helloworldlove:
Axis_UNZIP_PATH\Axis-version\we ...
3步把您的java程序转换为webservice -
hcqenjoy:
这个工具能再提供下吗 已经没办法下载了 谢谢
汉化 Flex Builder 3 帮助文档 -
NASa_CJ:
String source = HttpClientExamp ...
利用HttpClient获取网页内容 -
zlsj80:
下载地址无效了,楼主修正一下吧
汉化 Flex Builder 3 帮助文档 -
fykyx521:
下载地址都不能用了,是不过时了
汉化 Flex Builder 3 帮助文档
在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理。
Unix下的大多数网络服务器程序都是这么编写的,即父进程接受连接,派生子进程,子进程处理与客户的交互。
虽然这种模型很多年来使用得很好,但是fork时有一些问题:
1. fork是昂贵的。内存映像要从父进程拷贝到子进程,所有描述字要在子进程中复制等等。目前有的Unix实现使用一种叫做写时拷贝(copy-on-write)的技术,可避免父进程数据空间向子进程的拷贝。尽管有这种优化技术,fork仍然是昂贵的。
2. fork子进程后,需要用进程间通信(IPC)在父子进程之间传递信息。Fork之前的信息容易传递,因为子进程从一开始就有父进程数据空间及所有描述字的拷贝。但是从子进程返回信息给父进程需要做更多的工作。
线程有助于解决这两个问题。线程有时被称为轻权进程(lightweight process),因为线程比进程“轻权”,一般来说,创建一个线程要比创建一个进程快10~100倍。
一个进程中的所有线程共享相同的全局内存,这使得线程很容易共享信息,但是这种简易性也带来了同步问题。
一个进程中的所有线程不仅共享全局变量,而且共享:进程指令、大多数数据、打开的文件(如描述字)、信号处理程序和信号处置、当前工作目录、用户ID和组ID。
但是每个线程有自己的线程ID、寄存器集合(包括程序计数器和栈指针)、栈(用于存放局部变量和返回地址)、error、信号掩码、优先级。
在Linux中线程编程符合Posix.1标准,称为Pthreads。所有的pthread函数都以pthread_开头。
以下先讲述5个基本线程函数,在调用它们前均要包括pthread.h头文件。然后再给出用它们编写的一个TCP客户/服务器程序例子。
第一个函数:
int pthread_create (pthread_t *tid,const pthread_attr_t *attr,void *(*func)(void *),void *arg);
一个进程中的每个线程都由一个线程ID(thread ID)标识,其数据类型是pthread_t(常常是unsigned int)。如果新的线程
创建成功,其ID将通过tid指针返回。
每个线程都有很多属性:优先级、起始栈大小、是否应该是一个守护线程等等,当创建线程时,我们可通过初始化一个pthread_attr_t
变量说明这些属性以覆盖缺省值。我们通常使用缺省值,在这种情况下,我们将attr参数说明为空指针。
最后,当创建一个线程时,我们要说明一个它将执行的函数。线程以调用该函数开始,然 后或者显式地终止(调用pthread_exit) 或者隐式地终止(让该函数返回)。函数的地址由func参数指定,该函数的调用参数是一个指针arg,如果我们需要多个调用参数,我们必须将它们打包成一 个结构,然后将其地址当作唯一的参数传递给起始函数。
在func和arg的声明中,func函数取一个通用指针(void *)参数,并返回一个通用指针(void *),这就使得我们可以传递一个
指针(指向任何我们想要指向的东西)给线程,由线程返回一个指针(同样指向任何我们想要指向的东西)。
调用成功,返回0,出错时返回正Exxx值。Pthread函数不设置errno。
第二个函数:
int pthread_join(pthread_t tid,void **status);
该函数等待一个线程终止。把线程和进程相比,pthread_creat类似于fork,而pthread_join类似于waitpid。
我们必须要等待线程的tid,很可惜,我们没有办法等待任意一个线程结束。
如果status指针非空,线程的返回值(一个指向某个对象的指针)将存放在status指向的位置。
第三个函数;
pthread_t pthread_self(void);
线程都有一个ID以在给定的进程内标识自己。线程ID由pthread_creat返回,我们可以pthread_self取得自己的线程ID。
第四个函数:
int pthread_detach(pthread_t tid);
线程或者是可汇合的(joinable)或者是脱离的(detached)。当可汇 合的线程终止时,其线程ID和退出状态将保留,直到另外一个线程调用pthread_join。脱离的线程则像守护进程:当它终止时,所有的资源都释放, 我们不能等待它终止。如果一个线程需要知道另一个线程什么时候终止,最好保留第二个线程的可汇合性。
Pthread_detach函数将指定的线程变为脱离的。
该函数通常被想脱离自己的线程调用,如:pthread_detach (pthread_self ( ));
第五个函数:
void pthread_exit(void *status);
该函数终止线程。如果线程未脱离,其线程ID和退出状态将一直保留到调用进程中的某个其他线程调用pthread_join函数。
指针status不能指向局部于调用线程的对象,因为线程终止时这些对象也消失。
有两种其他方法可使线程终止:
1. 启动线程的函数(pthread_creat的第3个参数)返回。既然该函数必须说明为返回一个void指针,该返回值便是线程的终止状态。
2. 如果进程的main函数返回或者任何线程调用了exit,进程将终止,线程将随之终止。
以下给出一个使用线程的TCP回射客户/服务器的例子,完成的功能是客户端使用线程 给服务器发从标准输入得到的字符,并在主线程中将从服务器端返回的字符显示到标准输出,服务器端将客户端发来的数据原样返回给客户端,每一个客户在服务器 上对应一个线程。利用该程序框架,通过扩展客户端和服务器端的处理功能,可以完成多种基于多线程的客户机/服务器程序。该程序在RedHat 6.0和TurboLinux4.02下调试通过。
共用头文件如下:
<ccid_nobr> </ccid_nobr>
<ccid_code>(head.h) |
公用函数如下(common.c):
<ccid_nobr> </ccid_nobr>
<ccid_code>/* 从一个描述字读文本行 */ |
客户端主程序如下:
<ccid_nobr> </ccid_nobr>
<ccid_code>(client.c) |
服务器端主程序如下:
<ccid_nobr> </ccid_nobr>
<ccid_code>(server.c) |
发表评论
-
奇趣科技发布跨平台开发软件Qt 4.1新版本
2006-01-17 22:59 1236<noscript type="text/ja ... -
Ubuntu 5.10发布
2006-01-20 17:18 880<noscript type="text/ja ... -
Ubuntu 是什么
2006-01-20 17:21 1232<noscript type="text/ja ... -
MagicLinux 2.0 RC3 发布
2006-01-20 17:37 818<noscript type="text/ja ... -
Linux桌面:GNOME工程提供的两样东西
2006-04-06 13:02 862GNOME: GNU Network Object Model ... -
红旗Linux桌面5.0最终正式版本发布
2006-04-06 13:05 973看厌倦了Windows Vista跳票的新闻,我们一起来关注下 ... -
Java调用Linux命令
2006-04-07 12:56 1454Java可以直接调用Linux命令,形式如下: Runtim ... -
Ubuntu Linux 6.06 正式版 发布
2006-06-08 22:27 931<noscript type="text/ja ... -
我的Ubuntu6.06 解决方案(陆续更新中........)
2006-06-08 22:31 1204<noscript type="text/ja ... -
Java 5.0 多线程编程实践
2006-10-05 20:42 845Java5增加了新的类库并发集java.util.conc ... -
ubuntu 6.10 硬盘安装
2006-12-07 11:23 840ubuntu 6.10 硬盘安装 本文介绍了如何从iso文件硬 ... -
wxWidgets-2.6.1编译和在VC中的配置
2006-12-10 21:28 12081、 安装 运行wxMSW-2.6.1-S ... -
搭建跨平台编程环境Code::Blocks+wxWidgets
2006-12-10 21:34 2134Windows下 到Code::Block ... -
用 GDB 调试程序
2006-12-23 00:24 1034原著:Rick McMullin 用 gdb 调试 GCC 程 ... -
Linux操作系统中GCC的应用介绍
2007-01-17 14:14 1443在为Linux开发应用程序 ... -
Linux机上运行多个版本的MySQL
2007-12-19 13:37 1211在同一台服务器上部署多个MySQL服务,可以有效提高机 ... -
Mono开发Gtk#演示
2008-01-14 13:51 963 -
在Ubuntu上安装和使用mono
2008-01-20 15:42 3046微软的.NET框架与Linux开发和管理,是Buider AU ... -
越来越喜欢Linux了,看看我的Ubuntu 7.10
2008-02-01 21:39 820... -
Shell编程:Linux系统环境程序设计之路
2008-03-11 23:44 722函数 别的高级语言都有函数的感念,当然shell编程 ...
相关推荐
Linux下基于多线程的服务器程序设计.pdf
Linux操作系统下的多线程编程
操作系统课程项目,在linux下用c语言实现了多线程web服务器。可以选择不同的调度算法,来执行web请求,有FCFS, SJF。采用线程池设计思想实现。
Linux下的多线程编程.pdf
Linux下基于多线程的服务器程序设计研究.pdf
基于多线程的Linux下并发服务器的实现研究.pdf
1. 通过网络编程实现一个C/S模式的员工管理系统,服务器端用多进程等模型接受多个客户端同时连接、操作。具体内容要求如下: (1)员工只需要三个字段:姓名,年龄,手机号,用结构体表示; (2)服务器功能:添加新...
基于Linux的多线程池并发Web服务器设计.pdf
实验四 Linux系统下多进程与多线程编程 实验五 Linux系统的进程间通信:管道通信 实验六 Linux系统下利用链表实现动态内存分配 实验七 Linux系统下文件管理模拟实验 实验八 Linux系统下的字符设备驱动程序编程 补充...
基于Linux多线程管理的分析与实现.pdf
Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...
Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...
Linux物联网网关是基于Linux操作系统的嵌入式网关Server,通过多线程方式实现各种功能。它广泛应用于物联网嵌入式项目,包括参数数据解析、协议转换、Socket收发、Sqlite、Uart、Camera等操作,并提供友好的UI界面。...
Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...
Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...
Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...
Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...
Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...
Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...
Linux服务器是在Linux操作系统上运行的服务器。本教程将介绍Linux服务器的基础知识。 ## 目录 1. Linux服务器概述 2. Linux服务器的优势 3. Linux服务器的应用 4. Linux服务器的安装 5. 常见的Linux服务器命令 ##...