linux网络编程(四)线程池

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){}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIGC:大语言模型LLM的幻觉问题

引言 在使用ChatGPT或者其他大模型时&#xff0c;我们经常会遇到模型答非所问、知识错误、甚至自相矛盾的问题。 虽然大语言模型&#xff08;LLMs&#xff09;在各种下游任务中展示出了卓越的能力&#xff0c;在多个领域有广泛应用&#xff0c;但存在着幻觉的问题&#xff1a…

关于C++子类父类成员函数的覆盖和隐藏

转载&#xff1a;http://blog.csdn.net/worldmakewayfordream/article/details/46827161 函数的覆盖 覆盖发生的条件&#xff1a; &#xff08;1&#xff09; 基类必须是虚函数&#xff08;使用virtual 关键字来进行声明&#xff09; &#xff08;2&#xff09;发生覆盖的两个函…

数据结构(四)串的顺序存储

#include <stdio.h> #include <stdlib.h>#define MAXLEN 255 //定长顺序存储 typedef struct {char ch[MAXLEN]; //每个分量存储一个字符int length; //串的实际长度 }SString;//串的初始化 bool StrAssign(SString& T, char* chars) {int i 0, len;char* …

数据结构(四)串的动态数组存储

#include <stdio.h> #include <stdlib.h>#define MAXLEN 255 //定长顺序存储 typedef struct {char* ch; //每个分量存储一个字符int length; //串的实际长度 }SString;//串的初始化 bool StrAssign(SString& T, char* chars) {int i 0, len;T.ch (char*)m…

C++名字隐藏

转载&#xff1a;http://www.weixueyuan.net/view/6361.html 如果派生类中新增一个成员变量&#xff0c;该成员变量与基类中的成员变量同名&#xff0c;则新增的成员变量就会遮蔽从基类中继承过来的成员变量。同理&#xff0c;如果派生类中新增的成员函数与基类中的成员函数同…

c语言深入浅出(一)strcpy和memcpy的区别

c语言深入浅出&#xff08;一&#xff09;strcpy和memcpy的区别strcpy和memcpy都是c语言的库函数 strcpy:只用于字符串的复制&#xff0c;当碰到‘\0’就停止了 memcpy:用于这个内存的拷贝&#xff0c;适用于结构体、字符数组、类等 char * strcpy(char * dest, const char * s…

C++ dynamic_cast操作符

转载&#xff1a;http://www.weixueyuan.net/view/6377.html 在C中&#xff0c;编译期的类型转换有可能会在运行时出现错误&#xff0c;特别是涉及到类对象的指针或引用操作时&#xff0c;更容易产生错误。Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试。…

数据结构(五)树

数据结构&#xff08;五&#xff09;树一、基本操作树是n个节点的有限集&#xff0c;它是一种递归的数据结构 一、基本操作 #include <stdio.h> #include <stdlib.h> #include <iostream>#define Elemtype charusing namespace std; typedef struct BiTNod…

C++ typeid操作符

转载&#xff1a;http://www.weixueyuan.net/view/6378.html typeid操作符用于判断表达式的类型&#xff0c;注意它和sizeof一样是一个操作符而不是函数。如果需要使用typeid操作符&#xff0c;最好加上typeinfo头文件。 给出以下定义 int a;double b;char * c;long d; 下表列…

数据结构(五)层次遍历

数据结构&#xff08;五&#xff09;层次遍历// linear_listqueue.cpp : This file contains the main function. Program execution begins and ends there. //#include <iostream> #include <stdlib.h> #include <stdio.h> #define ElemType BiTree using …

C++成员函数指针的应用

转载&#xff1a;http://www.cppblog.com/colys/archive/2009/08/18/25785.html C中&#xff0c;成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中&#xff0c;每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中…

cv2.VideoCapture()无法打开视频解决方法

cv2.VideoCapture无法打开视频解决方法问题解决方法问题 cv2.VideoCapture打开mp4文件&#xff0c;直接报错 解决方法 我们打开D:\opencv_3.4.2_Qt\opencv_3.4.2_Qt\x86\bin\&#xff08;opencv的dll动态库中找到&#xff09; 找到opencv_ffmpeg342.dll文件&#xff0c;放入…

函数指针指向类的静态成员函数

转载&#xff1a;http://www.cnblogs.com/dongyanxia1000/p/4906592.html 1. 代码 1 #include<iostream>2 #include<stdio.h>3 using namespace std;4 class Point5 {6 public:7 Point(int x0,int y0):x(x),y(y)8 { 9 count; 10 } 11 P…

Qt+OpenCV打开视频文件并在窗口界面上显示

QtOpenCV打开视频文件并在窗口界面上显示1、新建一个Qt Widgets Application&#xff0c;工程配置文件&#xff08;.pro文件&#xff09;内容如下&#xff1a;#------------------------------------------------- # # Project created by QtCreator 2021-03-19T09:06:07 # #--…

OpenCV Mat的数据类型

OpenCV Mat的数据类型Mattype类型内存拷贝简单实现Mat Mat类(Matrix的缩写)是OpenCV用于处理图像而引入的-一个封装类。他是一个自动内存管理工具。 Mat:本质上是由两个数据部分组成的类:(包含信息有矩阵的大小&#xff0c;用于存储的方法&#xff0c;矩阵存储的地址等)矩阵头…

C++指向成员函数的指针

转载&#xff1a;http://www.cnblogs.com/tracylee/archive/2012/11/15/2772176.html C指向函数的指针定义方式为&#xff1a; 返回类型 &#xff08;*指针名&#xff09;&#xff08;函数参数列表&#xff09;&#xff0c;例如 void &#xff08;*p&#xff09;&#xff08;in…

OpenCV基础知识 图像

OpenCV基础知识 图像位图模式灰度模式RGB模式位图模式 位图模式是是1位深度的图像&#xff0c;只有黑和白两种颜色。它可以由扫描或置入黑色的矢量线条图像生成&#xff0c;也能由灰度模式转换而成。其他图像模式不能直接转换为位图模式。 灰度模式 灰度模式是8位的图像&…

C++中引用与指针的区别(详细介绍)

转载&#xff1a;http://www.cnblogs.com/tracylee/archive/2012/12/04/2801519.html C&#xff0b;&#xff0b;中的引用与指针的区别指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址&#xff08;指针指向的地址&#xff09;中的内存内容及大小&#xff…

mysql远程连接权限grant all privileges on *.* to ‘root‘@‘%‘ identified by ‘123456‘ with grant option语句报错

mysql远程连接权限grant all privileges on *.* to ‘root‘‘%‘ identified by ‘123456‘ with grant option语句报错记录一下自己安装mysql遇到的小坑grant all privileges on *.* to ‘root‘‘%‘ identified by ‘123456‘ with grant option只适用于mysql8.0之前的版本…

C++虚继承的概念

转载&#xff1a;http://blog.csdn.net/crystal_avast/article/details/7678704 C中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题&#xff0c;将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只…