两种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 这两个函数或者 ...
随机推荐
- Jar中的Java程序如何读取Jar包中的资源文件
Jar中的Java程序如何读取Jar包中的资源文件 比如项目的组织结构如下(以idea中的项目为例): |-ProjectName |-.idea/ //这个目录是idea中项目的属性文件夹 |-s ...
- Javamelody部署手册
Javamelody部署手册 1. Javamelody下载 下载地址:http://code.google.com/p/javamelody/downloads/list(注:需要FQ才能打开下载 ...
- Redis安装文档
1.前置条件 前置条件:linux已经可以上网,参考:https://www.cnblogs.com/ZenoLiang/p/10201875.html 2.安装redis 2.1依赖包检查 1. ...
- Win10系统优化/设置脚本
Win10系统优化/设置脚本 用了很长时间win10了,用的过程中,发现了一些问题,关于系统基本的优化,和个人的使用习惯设置等等,做成了一个脚本,可以一键设置win10的系统设置,结合DWS对Win1 ...
- opennebula image单个实例响应数据格式
{ ", ", ", "TEMPLATE": { "DEV_PREFIX": "hd", " }, ...
- Hyperledger Fabric Orderer节点启动
Orderer 节点启动通过 orderer 包下的 main() 方法实现,会进一步调用到 orderer/common/server 包中的 Main() 方法. 核心代码如下所示. // Mai ...
- Linux编译提速
一.简介 项目越来越大,重新编译整个项目是一件很费时的事,总结可以帮助提速方法,如下: 1)tmpfs: 解决IO瓶颈,充分利用本机内存资源 2)make -j: 充分利用本机计算资源 3)distc ...
- Python3 BeautifulSoup和Pyquery解析库随笔
BeautifuSoup和Pyquery解析库方法比较 1.对象初始化: BeautifySoup库: from bs4 import BeautifulSoup html = 'html strin ...
- [GO]局部变量的特点
package main import "fmt" func main() { //定义在{}里的变量就是局部变量,只能在{}里起作用 //作用域,变量起作用的范围 //执行到定义 ...
- 现代C++学习笔记之一入门篇:智能指针(C++ 11)
原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 在现代 C++ 编程中,标准库包含智能指针,该指针用于确保 ...