千家信息网

线程池网络服务

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,1、线程池网络服务:针对多线程网络服务模式的一些不足之处而提出的改进模式。池是一个很重要的概念,其基本理念是:先创建一批资源,当有用户到来时,直接分配以创建好的资源,它的主要目的是减少系统在频繁创建资
千家信息网最后更新 2026年10月31日线程池网络服务

1、线程池网络服务

:针对多线程网络服务模式的一些不足之处而提出的改进模式。

池是一个很重要的概念,其基本理念是:先创建一批资源,当有用户到来时,直接分配以创建好的资源,它的主要目的是减少系统在频繁创建资源时的开销。

实现原理:主服务线程创建既定数量的服务线程,当有客户端到来时,则从线程池中找出空闲的服务线程,为其服务,服务完毕后,线程不进行释放,重新放回线程池;若当前线程池已满,则将当前的客户端加入等待队列。

模型如下:


2、代码实现

同样用处理整数运算来模拟线程池的并发处理

(1)、utili.h

#include#include#include#include#include#include#include#include#define SERVER_PORT  8090#define SERVER_IP    "127.0.0.1"#define LISTEN_QUEUE  5#define BUFFER_SIZE   255#define CMD_SIZE      20    #define THREAD_POOL_NUM  5typedef enum{ADD,SUB,MUL,DIV,MOD, QUIT}OPER_TYPE;typedef enum{IDEL, BUSY}THREAD_TAG;typedef struct OperStruct{    int op1;    int op2;    OPER_TYPE oper;}OperStruct;

(2)、ser.c

#include"../utili.h"typedef struct PoolStruct{    int sockConn;    THREAD_TAG flag; }PoolStruct;typedef PoolStruct threadpool[THREAD_POOL_NUM];threadpool pool;pthread_t  tid[THREAD_POOL_NUM];void* Thread_Handler(void *arg);void* Thread_Handler(void *arg){    int index = *(int *)arg;    printf("[%d] thread start up.\n", index);    OperStruct op;     int result;    while(1){        if(pool[index].flag == BUSY){            printf("[%d] thread start wroking.\n", index);            int res = recv(pool[index].sockConn, &op, sizeof(op), 0);             if(res == -1){                printf("recv data fail.\n");                continue;            }            if(op.oper == ADD){                result = op.op1 + op.op2;            }else if(op.oper == SUB){                result = op.op1 - op.op2;            }else if(op.oper == MUL){                result = op.op1 * op.op2;            }else if(op.oper == DIV){                result = op.op1 / op.op2;            }else if(op.oper == QUIT){                break;            }            res = send(pool[index].sockConn, &result, sizeof(result), 0);            if(res == -1){                printf("send data fail.\n");                continue;            }        }else{            printf("[%d] thread sleep.\n",index);            sleep(1);        }    }    close(pool[index].sockConn);    pthread_exit(0);}    int main(void){    int sockSer = socket(AF_INET, SOCK_STREAM, 0);    if(sockSer == -1){        perror("socket");        return -1;    }    struct sockaddr_in addrSer, addrCli;    addrSer.sin_family = AF_INET;    addrSer.sin_port = htons(SERVER_PORT);    addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);    socklen_t len = sizeof(struct sockaddr);    int res = bind(sockSer, (struct sockaddr*)&addrSer, len);    if(res == -1){        perror("bind");        close(sockSer);        return -1;    }    listen(sockSer, LISTEN_QUEUE);    int i;    for(i=0; i%s\n", inet_ntoa(addrCli.sin_addr));            printf("Client Port:>%d\n",ntohs(addrCli.sin_port));        }        for(i=0; i

(3)、cli.c

#include"utili.h"void InputData(OperStruct *pt);void InputData(OperStruct *pt){    printf("please input op1 and op2 : ");    scanf("%d %d", &(pt->op1), &(pt->op2));}//Cliint main(void){    int sockCli = socket(AF_INET, SOCK_STREAM, 0);     if(sockCli == -1){        perror("socket");        return -1;     }       struct sockaddr_in addrSer;    addrSer.sin_family = AF_INET;    addrSer.sin_port = htons(SERVER_PORT);    addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);    socklen_t len = sizeof(struct sockaddr);    int res = connect(sockCli, (struct sockaddr*)&addrSer, len);    if(res == -1){        perror("connect");        close(sockCli);        return -1;     }else{        printf("Client Connect Server Success.\n");    }    char cmd[2];    OperStruct  op;    int result;    while(1){        printf("Please input operator : ");        scanf("%s",cmd);        if(strcmp(cmd, "+") == 0){            op.oper = ADD;            InputData(&op);        }else if(strcmp(cmd,"-") == 0){            op.oper = SUB;            InputData(&op);        }else if(strcmp(cmd,"*") == 0){            op.oper = MUL;            InputData(&op);        }else if(strcmp(cmd,"/") == 0){            op.oper = DIV;            InputData(&op);        }else if(strcmp(cmd, "quit") == 0){            op.oper = QUIT;        }else{            printf("Cmd invalid.\n");          }        res = send(sockCli, &op, sizeof(op), 0);        if(res == -1){            printf("send data fail.\n");            continue;        }        if(op.oper == QUIT)            break;        res = recv(sockCli, &result, sizeof(result), 0);        if(res == -1){            printf("recv data fail.\n");            continue;        }        printf("result = %d\n", result);    }    close(sockCli);    return 0;}

运行结果

服务器端


客户端1


客户端2

3、分析总结

(1)、其优点:性能高效

(2)、可能存在的问题:新用户如果在等待队列里耗时过长,会影响用户体验,针对此问题,改进方案如下:

a、动态创建新的服务线程,服务结束后,该线程加入线程池,这种改进的好处是,用户体验得到提升,潜在问题是,在长时间,大规模的并发用户状态下,线程会产生很多,最终会因为资源消耗过多,系统退出。

b、增加一个线程资源回收机制,当线程池的规模达到一定程度或满足某种既定规则时,会主动杀死一些线程,以达到系统稳定和用户体验之间折中。

模型分析


当有客户端来,有2种做法,i>、创建线程为其服务;ii>、加入等待队列;这2种都不太合适,采用折中法,有一个上限值,即就是规定一个创建线程的最大数,当来一个用户,还没达到线程最大数时,为其创建线程,若达到了,则加入等待队列;

对线程资源的回收:i>、立马回收,ii>、暂时不回收;当空闲的线程数达到某一下限值时,此时再将线程回收;



线程 服务 用户 资源 客户 客户端 队列 系统 问题 体验 网络 网络服务 最大 模型 模式 空闲 限值 分析 处理 折中 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网 湖北九亚互联网络科技有限公司 美国互联网保险保险科技 深圳互联网络科技有限公司 互联网科技的英文 小马过河互联网科技 撒么互联网科技公司 互联网科技咨询 海南购全球互联网科技 互联网和高科技公司 科技与互联网的利与弊 玉溪互联网科技怎么选 链环科技传统企业怎么转型互联网 乌鲁木齐新华智原互联网科技学校 中国互联网公司排名锤子科技 用友工业互联网科技发展 元气玛特互联网科技公司是外包吗 梅州GM互联网络科技有限公司 上海互联网科技公司ppt 互联网时代高科技布局 互联网和科技技术 科技与互联网发展 狮子座互联网科技培训 互联网科技有限公司 翻译 老年人脱离互联网科技的作文 欧洲十大科技互联网公司 合肥互联网科技公司公章图片 2021互联网科技公司排名 广州百诚互联网科技有限公司官网 美国五大互联网科技公司市值多少
0