当前位置: 首页 > wzjs >正文

公司备案查询网站品牌策划设计

公司备案查询网站,品牌策划设计,中国企业网聚焦中原,全国新冠疫情最新消息数据表目标 实现一个服务器程序,能够同时和多个客户端建立连接。 使用线程池,使用可以复用的线程,避免创建和销毁线程时的资源浪费,优化连接速度。 线程池实现 原理 线程池会提前创建出几个工作线程, 需要执行的任务&am…

目标

实现一个服务器程序,能够同时和多个客户端建立连接。
使用线程池,使用可以复用的线程,避免创建和销毁线程时的资源浪费,优化连接速度。

线程池实现

原理

线程池会提前创建出几个工作线程

需要执行的任务,会被放入线程池的任务队列

这几个工作线程会等待条件唤醒(pthread_cond),一旦任务队列中存在任务,那么就会唤醒,同时执行任务队列中元素的函数指针。

另外根据工作负载的不同,线程池会动态的添加会减小线程数量以应对不同情况(为了简化,本篇文章不涉及动态添加和销毁线程)。

实现

  • 数据结构
typedef struct ThreadPool{int max;int min;Task* TaskQueue;int queueFront;int queueRear;int queueSize;int queueCap;pthread_t* ThreadID;pthread_t manager_ThreadID;pthread_mutex_t threadpool_mutex;pthread_cond_t notFull;pthread_cond_t notEmpty;}ThreadPool;
  • 任务队列
    任务队列实际上是一个环形队列,队列的每个元素包括要执行的函数指针和传入函数的参数指针
void queueAdd(ThreadPool* threadpool,Task* task){pthread_mutex_lock(&threadpool->threadpool_mutex);if(threadpool->queueSize == threadpool->queueCap){pthread_cond_wait(&threadpool->notFull,&threadpool->threadpool_mutex);}threadpool->TaskQueue[threadpool->queueRear].function = task->function;threadpool->TaskQueue[threadpool->queueRear].arg = task->arg;threadpool->queueRear =  (threadpool->queueRear + 1)%threadpool->queueCap;threadpool->queueSize++;pthread_mutex_unlock(&threadpool->threadpool_mutex);pthread_cond_signal(&threadpool->notEmpty);
}
  • 工作线程
void* worker(void* arg){ThreadPool* threadpool = (ThreadPool*)arg;while(1){Task task;pthread_mutex_lock(&threadpool->threadpool_mutex);while(threadpool->queueSize == 0){pthread_cond_wait(&threadpool->notEmpty,&threadpool->threadpool_mutex);}task.function = threadpool->TaskQueue[threadpool->queueFront].function;task.arg = threadpool->TaskQueue[threadpool->queueFront].arg;threadpool->queueFront = (threadpool->queueFront + 1)%threadpool->queueCap;threadpool->queueSize--;pthread_mutex_unlock(&threadpool->threadpool_mutex);task.function(task.arg);pthread_cond_signal(&threadpool->notFull);}return NULL;
}

socket服务端实现

流程:

  • 创建套接字
  • 配置属性
  • 绑定端口和ip
  • 监听端口
  • 等待连接
  • read/write

初始化

void server_init(Socket_Info* info){info->lfd=socket(AF_INET, SOCK_STREAM, 0);if(info->lfd == -1){perror("socket");exit(0);}info->sock = (struct sockaddr*)malloc(sizeof(struct sockaddr_in));info->sock->sin_family = AF_INET;info->sock->sin_port = htons(10003);   // 大端端坣info->sock->sin_addr.s_addr = INADDR_ANY;int ret = bind(info->lfd, info->sock, sizeof(struct sockaddr_in));if(ret == -1){perror("bind");exit(0);}// 3. 设置监坬ret = listen(info->lfd, LISTEN_NUM);if(ret == -1){perror("listen");exit(0);}
}

连接和处理

    while(1){SubSocketInfo* subinfo;for(int i=0; i<MAX_CONNECT; ++i){if(infos[i].cfd == -1){subinfo = &infos[i];}}int cfd = accept(socket->lfd, (struct sockaddr*)&subinfo->addr, &clilen);subinfo->cfd = cfd;if(cfd == -1){perror("accept");break;}Task task;task.arg = subinfo;task.function = server_progress;queueAdd(pool,&task);}

void* server_progress(void* arg){SubSocketInfo* infos_ptr = (SubSocketInfo*)arg;char ip[24] = {0};printf("thread id: %ld 客户端的IP地址: %s, 端口: %d\n",pthread_self(),inet_ntop(AF_INET, &infos_ptr->addr.sin_addr.s_addr, ip, sizeof(ip)),ntohs(infos_ptr->addr.sin_port));while(1){char buf[1024];memset(buf, 0, sizeof(buf));int len = read(infos_ptr->cfd, buf, sizeof(buf));if(len > 0){printf("thread id: %ld 客户端say: %s\n",pthread_self(), buf);write(infos_ptr->cfd, buf, len);}else if(len  == 0){printf("客户端断开了连接...\n");break;}else{perror("read");break;}}close(infos_ptr->cfd);infos_ptr->cfd = -1;
}

配合实现

每次建立连接后,将服务端的处理函数和参数添加进线程池的任务队列中即可完成最简易的基于线程池的并发socket服务端函数。

http://www.dtcms.com/wzjs/386107.html

相关文章:

  • 做游戏开箱网站的法律风险网站优化就是搜索引擎优化
  • 做标签网站是什么样的今天国内新闻
  • 从哪些方面进行网站建设做推广
  • 网站的建设 想法深圳网站建设服务
  • wordpress多站版建站小程序
  • wordpress 如何修改域名seo发包软件
  • 大学生做家教靠谱网站武汉标兵seo
  • 手机游戏网站建设南京企业网站排名优化
  • 伊春网站建设百度搜索引擎网站
  • wordpress 关于页面洛阳seo外包公司费用
  • 哪些网站是营销型网站及原因花关键词排名系统
  • 做服装辅料一般什么网站找客户网站整合营销推广
  • seo课程培训班费用安阳企业网站优化外包
  • 苏州 网站制作公司seo赚钱培训
  • 做网站怎么加背景图片信息检索关键词提取方法
  • 想开网站建设公司南宁seo优势
  • 英国做电商网站网络营销专业大学排名
  • translate wordpress化工网站关键词优化
  • 做淘宝的货源网站全网网站快速排名推广软件
  • 网站代码多彩一键关键词优化
  • 虚拟主机可建站1个是不是只能放一个网站贵阳百度快照优化排名
  • 如何做网站排名优化搜狗推广效果好吗
  • 广州网站建设价格bt磁力链好用的引擎
  • 网站建设网站公司的序整合营销传播方案案例
  • 接网站制作站长工具国产
  • 设计网站都有什么作用是什么原因网络优化有前途吗
  • 网站开发技术岗位职责重庆关键词优化平台
  • 做ppt可以赚钱网站手游代理加盟哪个平台最强大
  • 旅游网站前端建设论文cms网站模板
  • 采用html5网站网页开发工具