两种unix网络编程线程池的设计方法
unp27章节中的27.12中,我们的子线程是通过操作共享任务缓冲区,得到task的,也就是通过线程间共享的clifd[]数组,这个数组其实就是我们的任务数组,得到其中的connfd资源。
我们对这个任务数组的操作,需要互斥量+条件变量达到同步的目的。。每个线程是无规律的从clifd得到任务,然后执行的。任务和线程之间没有对应关系。线程完成本次任务之后,如果任务数组中任然有任务,则再次运行下一个任务。
而另外的一个线程池模型中,pthread_create (&temp[i].tid, NULL, child_work, (void *) &temp[i]);,可以知道每个线程都运行chlid_child(struct pthread_node*)函数。这个函数的参数是我们的线程结构struct pthread_node(代表一个线程)。
我们把线程结构和任务之间建立关系,每个线程(用线程结构代表)对应于一个任务。
然后再child_work中,只要我们的线程结构中的work变量(指向一个任务结构)不为NULL,我们就开始运行程序。。。。(跟unp中的区别是,我们的线程和任务之间关系是之前就设置好的,但是也没有什么用,只是把unp中线程获得任务的步骤放到了thread_manger函数对应的线程中了。
本质上还是随机获得任务。
pthread_create (&thread_manager_tid, NULL, thread_manager, NULL);
这个线程的运行时是unp中没有的那个部分。。主要目的是为了或许任务,然后从空闲线程结构中获得空闲线程结构,把空闲线程结构和任务建立对应关系,以便child_work线程中,不用像unp那样,直接操作任务池。
本质上的区别是,我们由于有了线程池的结构,和线程结构。所以我们就拥有监视空闲线程和工作线程的数据结构,方便以后的监视操作的扩张。。
typedef struct pthread_queue
{
int number; /* the number of thread in this queue. */
struct pthread_node *head;
struct pthread_node *rear;
pthread_cond_t cond; /* when no idle thread, the manager wait for ,or when a thread return with idle, signal. */
pthread_mutex_t mutex;
} PTHREAD_QUEUE_T;
如果不是为了这个功能,我们使用unp中的方法更加简单。无论哪种设计,如果线程没有被销毁,我们的所有线程都在执行。所谓的空闲线程,只是被堵塞的线程。线程本身的资源还在。
两种unix网络编程线程池的设计方法的更多相关文章
- UNIX网络编程——线程池模式比较(ICE线程池模型和L/F领导者跟随者模式)
程池模式一般分为两种:L/F领导者与跟随者模式.HS/HA半同步/半异步模式. HS/HA 半同步/ 半异步模式 :分为三层,同步层.队列层.异步层,又称为生产者消费者模式,主线程处理I/O事件并解析 ...
- Linux——网络编程线程池机制
#include <stdlib.h>#include <pthread.h>#include <unistd.h>#include <assert.h> ...
- Unix网络编程中的五种I/O模型_转
转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...
- UNIX网络编程——非阻塞connect:时间获取客户程序
#include "unp.h" int connect_nonb(int sockfd, const SA *saptr, socklen_t salen, int nsec) ...
- 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数
本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...
- 《Unix 网络编程》05:TCP C/S 程序示例
TCP客户/服务器程序示例 系列文章导航:<Unix 网络编程>笔记 目标 ECHO-Application 结构如下: graph LR; A[标准输入/输出] --fgets--> ...
- 《Unix 网络编程》11:名字和地址转换
名字和地址转换 系列文章导航:<Unix 网络编程>笔记 域名系统 简介 域名系统主要用于主机名字和 IP 地址之间的映射.主机名可以是: 简单名字,如:centos01 全限定域名(FQ ...
- 《Unix 网络编程》14:高级 I/O 函数
高级 I/O 函数 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
- UNIX网络编程——getsockname和getpeername函数
UNIX网络编程--getsockname和getpeername函数 来源:网络转载 http://www.educity.cn/linux/1241293.html 这两个函数或者 ...
随机推荐
- ClientDataSet1.LoadFromStream
lStream3.Position := 0; lDataSet.LoadFromStream(lStream3);
- idata的各个类型
idata是51系列单片机能识别的存储器类型之一,固定指前面0x00-0xff的256个字节的片内RAM,其中前128字节和data的128字节完全相同,只是因为访问的方式不同.idata是用类似C中 ...
- ubuntu 14.04 安装压缩包版mysql
既有环境: 1)下载MySQL Community Server 5.6.17 压缩版(mysql-5.6.17-linux-glibc2.5-x86_64.tar.gz) 2)安装目录: /opt/ ...
- AOP操作术语
- c语言语法目录一
1.#include<stdio.h> include 是要告诉编译器,包含一个头文件 在c语言中,任何库函数调用都需要提前包含头文件 <头文件> 代表让c语言编译器去系统目录 ...
- Linux的基本指令--目录和文件和文件属性和文件用户组
目录和文件 一 . ls:列出目录的内容,未给出目录名或是文件名时,就显示当前目录的信息. -a 列出隐藏文件,文件中以”.”开头的均为隐藏文件,如:~/.bashrc -l 列出文件的详细信息 ...
- java基础之io流总结三:字节流读写
字节流读写适用于任何文件,包括图片,视频等. 基本字节流 一次读一个字节和一次读一个字节数组 FileInputStream fis = new FileInputStream(path); //一次 ...
- Linux 安装lamp
安装软件包编译器 gcc -v 查看是否存在 yum -y install gcc gcc-c++ mack rpm -q httpd 查看是否安装http rpm -e httpd --nodeps ...
- Docker学习之路(三)Docker网络详解
1. Docker的4种网络模式 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host ...
- IP协议、ARP协议等之温故知新
今天才知道: 1.IP协议的固定部分长度为20字节.(貌似有一家运维工程师面试我的时候,问过我这个问题呢.) 2.IP数据包首部中的协议?? 答:协议:占8位,指出此数据报携带的数据使用何种协议以便目 ...