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网络编程线程池的设计方法的更多相关文章

  1. UNIX网络编程——线程池模式比较(ICE线程池模型和L/F领导者跟随者模式)

    程池模式一般分为两种:L/F领导者与跟随者模式.HS/HA半同步/半异步模式. HS/HA 半同步/ 半异步模式 :分为三层,同步层.队列层.异步层,又称为生产者消费者模式,主线程处理I/O事件并解析 ...

  2. Linux——网络编程线程池机制

    #include <stdlib.h>#include <pthread.h>#include <unistd.h>#include <assert.h> ...

  3. Unix网络编程中的五种I/O模型_转

    转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...

  4. UNIX网络编程——非阻塞connect:时间获取客户程序

    #include "unp.h" int connect_nonb(int sockfd, const SA *saptr, socklen_t salen, int nsec) ...

  5. 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

    本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...

  6. 《Unix 网络编程》05:TCP C/S 程序示例

    TCP客户/服务器程序示例 系列文章导航:<Unix 网络编程>笔记 目标 ECHO-Application 结构如下: graph LR; A[标准输入/输出] --fgets--> ...

  7. 《Unix 网络编程》11:名字和地址转换

    名字和地址转换 系列文章导航:<Unix 网络编程>笔记 域名系统 简介 域名系统主要用于主机名字和 IP 地址之间的映射.主机名可以是: 简单名字,如:centos01 全限定域名(FQ ...

  8. 《Unix 网络编程》14:高级 I/O 函数

    高级 I/O 函数 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

  9. UNIX网络编程——getsockname和getpeername函数

    UNIX网络编程--getsockname和getpeername函数   来源:网络转载   http://www.educity.cn/linux/1241293.html     这两个函数或者 ...

随机推荐

  1. java实现 数组中两个元素相加等于指定数的所有组合

      package com.algorithm.hash; public class alg1 { public static void main(String argv[]) { int[] arr ...

  2. Animation Parameter

    [Animation Parameter] Animation Parameters are variables that are defined within the animation syste ...

  3. Mongodb的安装与启动

    下载链接: http://www.mongodb.org/downloads ------------------------------------------------------------- ...

  4. (一)maven的安装

    Maven下载 下载地址:http://maven.apache.org/download.cgi 下载完成后,得到一个压缩包

  5. Ionic01 简单介绍、环境搭建、创建项目、项目结构、创建组件、创建页面、子页面跳转

    1 Ionic 基本介绍 Ionic 是一款基于 Angular.Cordova 的强大的 HTML5 移动应用开发框架 , 可以快速创建一个跨平台的移动应用.可以快速开发移动 App.移动端 WEB ...

  6. 基于Nginx实现集群原理

    1)安装Nginx 2)配置多个Tomcat,并修改端口号(两个端口号不一样即可) 3)在Nginx的Nginx.conf添加如下配置:

  7. java就业指南 zookeeper分布式系统 zookeeper实现分布式锁 有用

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个 分布式系统都无法同时满足一致性(Consistency).可用性 ...

  8. EXE DLL等可执行程序添加版本号版权等信息

    在使用Microsoft Visual Studio开发工具等编写的exe或者dll等可执行文件时,我们往往需要对这些可执行文件添加版本号,公司,版权等信息. 1. 在我们需要添加各种信息的项目工程中 ...

  9. Django--form保存用户输入内容

    需求 用户提交form时,如果报错,页面中的用户信息还在(除了密码),没有被刷新掉,不用用户再次输入. 速查 views.py 1 2 3 def login(request):     obj = ...

  10. export default {} 和new Vue()区别

     1.export default 的用法:相当于提供一个接口给外界,让其他文件通过 import 来引入使用. 而对于export default 和export的区别:  在JavaScript ...