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.pswp.cn/news/384379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384379.shtml
英文地址,請注明出處:http://en.pswp.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;將共同基類設置為虛基類。這時從不同的路徑繼承過來的同名數據成員在內存中就只…