中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

網(wǎng)站開源系統(tǒng)免費網(wǎng)站建設seo

網(wǎng)站開源系統(tǒng),免費網(wǎng)站建設seo,有網(wǎng)站怎么做淘寶客,網(wǎng)站技術部門架構[Linux]線程池 文章目錄 [Linux]線程池線程池的概念線程池的優(yōu)點線程池的應用場景線程池的實現(xiàn) 線程池的概念 線程池是一種線程使用模式。線程池是一種特殊的生產(chǎn)消費模型,用戶作為生產(chǎn)者,線程池作為消費者和緩沖區(qū)。 線程過多會帶來調度開銷&#xff0c…

[Linux]線程池

文章目錄

  • [Linux]線程池
    • 線程池的概念
    • 線程池的優(yōu)點
    • 線程池的應用場景
    • 線程池的實現(xiàn)

線程池的概念

線程池是一種線程使用模式。線程池是一種特殊的生產(chǎn)消費模型,用戶作為生產(chǎn)者,線程池作為消費者和緩沖區(qū)。

線程過多會帶來調度開銷,進而影響緩存局部和整體性能,而線程池維護著多個線程,等待著監(jiān)督管理者分配可并發(fā)執(zhí)行的任務。

線程池的優(yōu)點

  • 線程池避免了在處理短時間任務時創(chuàng)建與銷毀線程的代價。
  • 線程池不僅能夠保證內(nèi)核充分利用,還能防止過分調度。

注意: 線程池中可用線程的數(shù)量應該取決于可用的并發(fā)處理器、處理器內(nèi)核、內(nèi)存、網(wǎng)絡sockets等的數(shù)量。

線程池的應用場景

  1. 需要大量的線程來完成任務,且完成任務的時間比較短。
  2. 對性能要求苛刻的應用,比如要求服務器迅速響應客戶請求。
  3. 接受突發(fā)性的大量請求,但不至于使服務器因此產(chǎn)生大量線程的應用。

線程池的實現(xiàn)

下面我們實現(xiàn)一個簡單的線程池,線程池中提供了一個任務隊列,以及若干個線程(多線程)。

image-20231029145843142

  • 線程池中的多個線程負責從任務隊列當中拿任務,并將拿到的任務進行處理。
  • 線程池對外提供一個Push接口,用于讓外部線程能夠將任務Push到任務隊列當中。

線程池的代碼如下:

#pragma once#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <vector>
#include <queue>const int N = 5; // 線程池內(nèi)線程數(shù)量template <class T>
class ThreadPool
{
public:ThreadPool(int num = N) : _num(num){pthread_mutex_init(&_mutex, nullptr);pthread_cond_init(&_cond, nullptr);}void LockQueue(){pthread_mutex_lock(&_mutex);}void UnLockQueue(){pthread_mutex_unlock(&_mutex);}void threadWait(){pthread_cond_wait(&_cond, &_mutex);}void threadWakeUP(){pthread_cond_signal(&_cond);}T getTask(){T t = _tasks.front();_tasks.pop();return t;}bool isEmpty(){return _tasks.empty();}static void *threadRoutine(void *args){pthread_detach(pthread_self());ThreadPool<T> *tp = static_cast<ThreadPool<T> *>(args);while (true){tp->LockQueue();while (tp->isEmpty()){tp->threadWait();}T t = tp->getTask();tp->UnLockQueue();t.Run();//任務處理}}void Start(){pthread_t tid;for (int i = 0; i < _num; i++){pthread_create(&tid, nullptr, threadRoutine, this);}}void PushTask(T &task) // 添加任務{LockQueue();_tasks.push(task);threadWakeUP();UnLockQueue();}~ThreadPool(){pthread_mutex_destroy(&_mutex);pthread_cond_destroy(&_cond);}private:int _num;                        // 線程數(shù)std::queue<T> _tasks;            // 任務隊列pthread_mutex_t _mutex; // 保證互斥訪問任務隊列這一共享資源pthread_cond_t _cond;   // 根據(jù)任務隊列中的任務數(shù)量控制線程的等待和運行
};

為什么線程池中需要有互斥鎖和條件變量?

互斥鎖: 任務隊列是一個共享資源,外部線程可以調用添加任務的接口訪問任務隊列,線程池內(nèi)部的線程可以直接訪問任務隊列處理任務,可能會造成任務隊列的并發(fā)訪問問題,因此需要利用互斥鎖保護任務隊列中的數(shù)據(jù)。

條件變量: 線程池當中的線程要從任務隊列里拿任務,前提條件是任務隊列中必須要有任務,因此線程池當中的線程在拿任務之前,需要先判斷任務隊列當中是否有任務,若此時任務隊列為空,那么該線程應該進行等待,直到任務隊列中有任務時再將其喚醒,因此我們需要引入條件變量。

當外部線程向任務隊列中Push一個任務后,此時可能有線程正處于等待狀態(tài),因此在新增任務后需要喚醒在條件變量下等待的線程。

為什么線程池中的線程執(zhí)行例程需要設置為靜態(tài)方法?

使用pthread_create函數(shù)創(chuàng)建線程時,需要為創(chuàng)建的線程傳入一個執(zhí)行方法threadRoutine,該執(zhí)行方法只有一個參數(shù)類型為void的參數(shù),以及返回類型為void的返回值。

如果threadRoutine作為類的成員函數(shù),該函數(shù)的第一個參數(shù)是隱藏的this指針,無法通過編譯。而靜態(tài)成員函數(shù)屬于類,而不屬于某個對象,也就是說靜態(tài)成員函數(shù)是沒有隱藏的this指針的,因此我們需要將threadRoutine設置為靜態(tài)方法,此時threadRoutine函數(shù)才真正只有一個參數(shù)類型為void的參數(shù)。

但是在靜態(tài)成員函數(shù)內(nèi)部無法調用非靜態(tài)成員函數(shù),而我們需要在threadRoutine函數(shù)當中調用該類的某些非靜態(tài)成員函數(shù)。因此我們需要在創(chuàng)建線程時,向threadRoutine函數(shù)傳入的當前對象的this指針,此時我們就能夠通過該this指針在threadRoutine函數(shù)內(nèi)部調用非靜態(tài)成員函數(shù)了。

任務類型的設計

由于線程池編寫的是模板化的,因此任務類型可以是任意的,但是由于處理任務的邏輯是通過調用任務的Run函數(shù),因此任務類中必須實現(xiàn)Run函數(shù)才能使用該線程池。

例如,實現(xiàn)一個計算任務類如下:

#include <cstdlib>
#include <iostream>class Task
{
public:Task(int x, int y, char op) : _x(x), _y(y), _op(op), _result(0), _exitcode(0){}void Run()//對傳入數(shù)據(jù)進行操作{switch (_op){case '+':_result = _x + _y;break;case '-':_result = _x - _y;break;case '*':_result = _x * _y;break;case '/':if (_y == 0) _exitcode = -1;else_result = _x / _y;break;case '%':if (_y == 0) _exitcode = -2;else_result = _x % _y;break;default:break;}std::string result = std::to_string(_x) + _op +  std::to_string(_y) + "=" + std::to_string(_result) + "(exicode:" + std::to_string(_exitcode);std::cout << result << std::endl;}private:int _x;//左操作數(shù)int _y;//右操作數(shù)char _op;//操作符int _result;//算數(shù)結果int _exitcode;//退出碼
};

線程池內(nèi)的線程在從任務隊列拿出任務進行處理的過程,并不需要關心這些任務的類型和來源,只需要拿到任務后執(zhí)行對應的Run方法即可。

主線程實現(xiàn)

主線程只需要不斷向任務隊列當中Push任務就行了,此后線程池當中的線程會從任務隊列當中獲取到這些任務并進行處理。

#include "ThreadPoolv1.hpp"
#include "Task.hpp"
#include <memory>
#include <ctime>using namespace std;int main()
{std::unique_ptr<ThreadPool<Task>> tp(new ThreadPool<Task>());tp->Start();time(nullptr);const char* ops = "+-*/%";while(true){int x, y;x = rand() % 50;y = rand() % 50;char op = ops[rand()%5];Task t(x, y, op);tp->PushTask(t);sleep(1);}return 0;
}

運行代碼后會產(chǎn)生六個線程,其中一個是主線程,另外五個是線程池內(nèi)處理任務的線程:

image-20231029152724549

http://m.risenshineclean.com/news/32341.html

相關文章:

  • 營銷qq和企業(yè)qq區(qū)別深圳專門做seo的公司
  • 網(wǎng)站建設英文怎么說百度一下你就知道官網(wǎng)網(wǎng)址
  • 成都商城網(wǎng)站建設地址推廣網(wǎng)頁怎么做的
  • 西安網(wǎng)站制作公司排名口碑營銷屬于什么營銷
  • 西部數(shù)碼網(wǎng)站助手4.0運營商推廣5g技術
  • 初學網(wǎng)站開發(fā)書籍關鍵詞歌曲歌詞
  • 濟南網(wǎng)站建設培訓學校百度首頁推薦關不掉嗎
  • 手機網(wǎng)站底部代碼北京seo網(wǎng)站管理
  • 網(wǎng)站開發(fā)z億瑪酷1流量訂制怎么做信息流廣告代理商
  • 海珠區(qū)建網(wǎng)站公司著名的網(wǎng)絡營銷案例
  • 怎么用模板做網(wǎng)站云南seo
  • 做網(wǎng)站 圖片素材怎么找智能建站系統(tǒng)
  • 醫(yī)院網(wǎng)站建設預算表企業(yè)網(wǎng)站制作步驟
  • 珠海營銷型網(wǎng)站建設百度站內(nèi)搜索的方法
  • 設置 wap網(wǎng)站seo網(wǎng)站自動發(fā)布外鏈工具
  • 怎么做網(wǎng)站掃描廣告點擊一次多少錢
  • 網(wǎng)站建設公司的服務特點網(wǎng)站優(yōu)化方案模板
  • 做電影網(wǎng)站考什么電商平臺推廣費用大概要多少
  • 網(wǎng)站優(yōu)化要從哪些方面做上海seo網(wǎng)站推廣
  • 吉林市做網(wǎng)站的科技公司網(wǎng)絡推廣常見的方法
  • 純html5網(wǎng)站源碼長沙網(wǎng)站優(yōu)化價格
  • 網(wǎng)站加速cdn自己做互聯(lián)網(wǎng)推廣是什么
  • 怎樣用wordpress建站網(wǎng)絡銷售是什么工作內(nèi)容
  • 社交平臺推廣方式seo外包方法
  • 網(wǎng)站建設 時間安排推廣軟件賺錢的app
  • 網(wǎng)站建設正版軟件廣東網(wǎng)站營銷seo方案
  • 做網(wǎng)站 價格seo怎么優(yōu)化方案
  • 保定專業(yè)做網(wǎng)站的公司最近的國際新聞
  • 足球網(wǎng)站建設企業(yè)網(wǎng)站怎么推廣
  • 建設網(wǎng)站時以什么為導向拼多多代運營公司十大排名