linux网络编程(四)线程池

  • 为什么会有线程池?
  • 实现简单的线程池

为什么会有线程池?

大多数的服务器可能都有这样一种情况,就是会在单位时间内接收到大量客户端请求,我们可以采取接受到客户端请求创建一个线程的方式来执行,虽然线程对于进程来说开销已经很低了,但是大量的请求,也会占用巨量cpu资源。那么我们能不能采取一种方法来解决这个问题呢。线程池就出现了,假设我们会创建5个空闲线程,我们会将这些任务存入到队列中,当我们有空闲线程时就来处理任务,这样占用巨大cpu资源的情况是不是就能解决了呢。

实现简单的线程池

#pragma once#include <stdio.h>
#include <stdlib.h>
/*
任务类:线程所要实现的功能在任务类中实现
*/
class Ctask
{public:Ctask();~Ctask();void run();
private:};
#include "Ctask.h"Ctask::Ctask()
{}Ctask::~Ctask()
{}void Ctask::run()
{printf("do task !\n");}

线程池需要一个锁,为什么呢?其实很简单,多个线程同时调用的,会出现竞争的情况,那么使用锁,可以防止这种情况。
同时还有一个问题,当任务来的时候,我们怎么让线程知道,这时我们所采用的就是条件变量,当任务来的时候,通知线程来执行

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <iostream>
#include <stack>
#include <queue>
#include "Ctask.h"
using namespace std;typedef struct thread_pool
{pthread_cond_t cond;pthread_mutex_t mutex;int idel;  //当前空闲线程的数量,如果空闲线程>0,唤醒线程,如果没有,创建新线程int count;//当前有多少线程queue<Ctask*>task;
}THREAD_POOL_T;
class Threadpool
{public:THREAD_POOL_T pool;//线程池初始化Threadpool();~Threadpool();void thread_pool_add_task(Ctask* t);
private:};
#include "Threadpool.h"void* start_routine(void* arg)
{THREAD_POOL_T* pool = (THREAD_POOL_T*)arg; //转化while (1){//加锁pthread_mutex_lock(&pool->mutex);pool->idel++;if (pool->task.empty())//如果任务队列为空,条件变量等待加入任务{cout << "wait for wake .... =>" << pthread_self() << endl;pthread_cond_wait(&pool->cond,&pool->mutex);cout << "wake up .... =>" << pthread_self() << endl;}//取走任务pool->idel--;//从线程池里取走任务Ctask* t = pool->task.front();pool->task.pop();//解锁pthread_mutex_unlock(&pool->mutex);printf("%d\n",pool->task.size());t->run();}}Threadpool::Threadpool()
{//初始化条件变量pthread_cond_init(&pool.cond,NULL);//初始化锁pthread_mutex_init(&pool.mutex,NULL);pool.idel = 0;pool.count = 0;//默认创建三个线程for (int i = 0; i < 3; i++){pthread_t pid;pthread_create(&pid,NULL,start_routine,&pool);pool.count++;}}Threadpool::~Threadpool()
{}void Threadpool::thread_pool_add_task(Ctask* t)
{//printf("3\n");//往pool这个线程池结构体的队列里面添加一个任务pthread_mutex_lock(&pool.mutex);pool.task.push(t);//把任务加到线程池的栈里面,相当于存起来//判断有没有空闲线程,如果有,就唤醒线程if (pool.idel > 0){pthread_cond_signal(&pool.cond);}else{pthread_t tid;pthread_create(&tid, NULL, start_routine, &pool);}pthread_mutex_unlock(&pool.mutex);}
#include <cstdio>
#include "Threadpool.h"int main()
{//创建一个线程池,5个线程//往线程池里面添加任务,线程会执行任务Threadpool* pool = new Threadpool();for (int i = 0; i < 10; i++){Ctask* t=new Ctask();pool->thread_pool_add_task(t);}while (1){}}

linux网络编程(四)线程池相关推荐

  1. Linux网络编程8——线程池模型

    学习视频链接 05-线程池模型原理分析_bilibili_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411S7UA?p=91&vd_so ...

  2. Linux 网络编程四(socket多线程升级版)

    //网络编程--客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...

  3. 【Linux系统编程】线程池

    00. 目录 文章目录 00. 目录 01. 线程池原理 02. 线程池应用实例 03. 线程池代码 04. 附录 01. 线程池原理 在传统服务器结构中,常是有一个总的监听线程监听有没有新的用户连接 ...

  4. C++教程网之Linux网络编程视频 Unix网络编程视频

    教程非常不错,价值280元,绝对是干货 Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章. Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 ...

  5. 网络编程9_线程-条件,定时器,队列,线程池, 协程

    线程 一. 条件     使得线程等待,只有满足某条件时,才释放n个线程     import time     from threading import Thread,RLock,Conditio ...

  6. 【Linux网络编程】TCP三次握手和四次挥手

    00. 目录 文章目录 00. 目录 01. 三次握手 02. 四次挥手 03. 三次握手和四次挥手原因 04. 2MSL 05. 附录 01. 三次握手 在 TCP/IP 协议中,TCP 协议提供可 ...

  7. 详情讲述Linux网络编程关注的问题丨epoll原理丨reactor模型丨三次挥手丨四次握手丨多线程丨单线程丨C/C++Linux丨C++后端开发

    90分钟搞懂linux网络编程关注的问题 1. 三次挥手,四次握手 2. epoll实现原理剖析 3. reactor模型封装 单线程.多线程以及多进程 视频讲解如下,点击观看: 详情讲述Linux网 ...

  8. Linux网络编程3——多进/线程并发服务器

    视频链接 黑马程序员-Linux网络编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411S7UA?p=37 目录 一.高并发服务器 1.1 图 ...

  9. Linux网络编程——黑马程序员笔记

    01P-复习-Linux网络编程 02P-信号量生产者复习 03P-协议 协议: 一组规则. 04P-7层模型和4层模型及代表协议 分层模型结构: OSI七层模型: 物.数.网.传.会.表.应TCP/ ...

最新文章

  1. jQuery 调用jsonp实现与原理
  2. 比赛-模拟赛 (17 Aug, 2018) (待施工)
  3. pylucene构建索引_java-Apache Lucene:建立索引时如何使用TokenSt...
  4. 一个全屏页面切换实例
  5. SVM入门(八)松弛变量(转)
  6. {php mysql}
  7. 三问(why?what?how?)金融领域的机器学习
  8. C# Lock的基本使用和声明
  9. xvidcore-1.3.2编译
  10. linux 下kali linux 中使用hydra 进行对虚拟机中win10系统的密码破解
  11. 中南大学计算机2020研究生分数线,中南大学2020年考研复试分数线已公布
  12. 浪潮IPBS9505S短接线刷固件(附教程)
  13. [CSR]在CSR8675的Source工程实现串口收发实例
  14. Linux命令打开电源设置,使用Linux控制USB电源(开/关)
  15. 天龙八部怀旧服服务器维护,新天龙八部怀旧服12月17日全服更新维护公告
  16. java整合谷歌翻译
  17. 基于PHP的学生在线成绩管理系统
  18. 团队项目之选题报告和需求规格说明书
  19. angular 数据加载完毕执行js方法
  20. linux服务器有电信和网通,linux双线路双ip,设置电信和网通走不同的路由。

热门文章

  1. Oracle使用startup与startup force启动的区别
  2. python模块;opencv安装
  3. Codeforces Round #277 (Div. 2) 题解
  4. 恋爱Linux(Fedora20)2——安装Java运行环境(JDK)
  5. Win32动态库 Lib文件哪去了
  6. 利用 dbghelp.dll 生成 dump 文件
  7. Windows环境下smarty安装简明教程
  8. linux php7 mongodb,CentOS 7下安装配置PHP7跟LAMP及MongoDB和Redis
  9. html dom概念,js学习之HTML DOM的一些基础概念
  10. spark抽取mysql数据到hive_使用spark将内存中的数据写入到hive表中