www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > > 充電吧
[導讀]為什么要使用線程池?? ? ? ?目前的大多數(shù)網(wǎng)絡服務器,包括Web服務器、Email服務器以及數(shù)據(jù)庫服務器等都具有一個共同點,就是單位時間內(nèi)必須處理數(shù)目巨大的連接請求,但處理時間卻相對較短。? ?

為什么要使用線程池?
? ? ? ?目前的大多數(shù)網(wǎng)絡服務器,包括Web服務器、Email服務器以及數(shù)據(jù)庫服務器等都具有一個共同點,就是單位時間內(nèi)必須處理數(shù)目巨大的連接請求,但處理時間卻相對較短。
? ? ? ?傳統(tǒng)多線程方案中我們采用的服務器模型則是一旦接受到請求之后,即創(chuàng)建一個新的線程,由該線程執(zhí)行任務。任務執(zhí)行完畢后,線程退出,這就是是“即時創(chuàng)建,即時銷毀”的策略。盡管與創(chuàng)建進程相比,創(chuàng)建線程的時間已經(jīng)大大的縮短,但是如果提交給線程的任務是執(zhí)行時間較短,而且執(zhí)行次數(shù)極其頻繁,那么服務器將處于不停的創(chuàng)建線程,銷毀線程的狀態(tài)。
我們將傳統(tǒng)方案中的線程執(zhí)行過程分為三個過程:T1、T2、T3。
T1:線程創(chuàng)建時間
T2:線程執(zhí)行時間,包括線程的同步等時間
T3:線程銷毀時間
? ? ? ?那么我們可以看出,線程本身的開銷所占的比例為(T1+T3) / (T1+T2+T3)。如果線程執(zhí)行的時間很短的話,這比開銷可能占到20%-50%左右。如果任務執(zhí)行時間很長的話,這筆開銷將是不可忽略的。
? ? ? ?除此之外,線程池能夠減少創(chuàng)建的線程個數(shù)。通常線程池所允許的并發(fā)線程是有上界的,如果同時需要并發(fā)的線程數(shù)超過上界,那么一部分線程將會等待。而傳統(tǒng)方案中,如果同時請求數(shù)目為2000,那么最壞情況下,系統(tǒng)可能需要產(chǎn)生2000個線程。盡管這不是一個很大的數(shù)目,但是也有部分機器可能達不到這種要求。
? ? ? ?因此線程池的出現(xiàn)正是著眼于減少線程本身帶來的開銷。線程池采用預創(chuàng)建的技術,在應用程序啟動之后,將立即創(chuàng)建一定數(shù)量的線程(N1),放入空閑隊列中。這些線程都是處于阻塞(Suspended)狀態(tài),不消耗CPU,但占用較小的內(nèi)存空間。當任務到來后,緩沖池選擇一個空閑線程,把任務傳入此線程中運行。當N1個線程都在處理任務后,緩沖池自動創(chuàng)建一定數(shù)量的新線程,用于處理更多的任務。在任務執(zhí)行完畢后線程也不退出,而是繼續(xù)保持在池中等待下一次的任務。當系統(tǒng)比較空閑時,大部分線程都一直處于暫停狀態(tài),線程池自動銷毀一部分線程,回收系統(tǒng)資源。
? ? ? 基于這種預創(chuàng)建技術,線程池將線程創(chuàng)建和銷毀本身所帶來的開銷分攤到了各個具體的任務上,執(zhí)行次數(shù)越多,每個任務所分擔到的線程本身開銷則越小,不過我們另外可能需要考慮進去線程之間同步所帶來的開銷
線程池適合場景
? ? ? ?事實上,線程池并不是萬能的。它有其特定的使用場合。線程池致力于減少線程本身的開銷對應用所產(chǎn)生的影響,這是有前提的,前提就是線程本身開銷與線程執(zhí)行任務相比不可忽略。如果線程本身的開銷相對于線程任務執(zhí)行開銷而言是可以忽略不計的,那么此時線程池所帶來的好處是不明顯的,比如對于FTP服務器以及Telnet服務器,通常傳送文件的時間較長,開銷較大,那么此時,我們采用線程池未必是理想的方法,我們可以選擇“即時創(chuàng)建,即時銷毀”的策略。
總之線程池通常適合下面的幾個場合:
(1)單位時間內(nèi)處理任務頻繁而且任務處理時間短
(2)對實時性要求較高。如果接受到任務后在創(chuàng)建線程,可能滿足不了實時要求,因此必須采用線程池進行預創(chuàng)建。

首先感謝github上大神的分享:https://github.com/progschj/ThreadPool

代碼非常的簡潔,只有一個頭文件ThreadPool.h,這里貼出來作為備份。

#ifndef?THREAD_POOL_H
#define?THREAD_POOL_H

#include#include#include#include#include#include#include#include#includeclass?ThreadPool?{
public:
????ThreadPool(size_t);
????templateauto?enqueue(F&&?f,?Args&&...?args)?
????????->?std::future<typename?std::result_of::type>;
????~ThreadPool();
private:
????//?need?to?keep?track?of?threads?so?we?can?join?them
????std::vector<?std::thread?>?workers;
????//?the?task?queue
????std::queue<?std::function>?tasks;
????
????//?synchronization
????std::mutex?queue_mutex;
????std::condition_variable?condition;
????bool?stop;
};
?
//?the?constructor?just?launches?some?amount?of?workers
inline?ThreadPool::ThreadPool(size_t?threads)
????:???stop(false)
{
????for(size_t?i?=?0;i<threads;++i)
????????workers.emplace_back(
????????????[this]
????????????{
????????????????for(;;)
????????????????{
????????????????????std::functiontask;

????????????????????{
????????????????????????std::unique_locklock(this->queue_mutex);
????????????????????????this->condition.wait(lock,
????????????????????????????[this]{?return?this->stop?||?!this->tasks.empty();?});
????????????????????????if(this->stop?&&?this->tasks.empty())
????????????????????????????return;
????????????????????????task?=?std::move(this->tasks.front());
????????????????????????this->tasks.pop();
????????????????????}

????????????????????task();
????????????????}
????????????}
????????);
}

//?add?new?work?item?to?the?pool
templateauto?ThreadPool::enqueue(F&&?f,?Args&&...?args)?
????->?std::future<typename?std::result_of::type>
{
????using?return_type?=?typename?std::result_of::type;

????auto?task?=?std::make_shared<?std::packaged_task>(
????????????std::bind(std::forward(f),?std::forward(args)...)
????????);
????????
????std::futureres?=?task->get_future();
????{
????????std::unique_locklock(queue_mutex);

????????//?don't?allow?enqueueing?after?stopping?the?pool
????????if(stop)
????????????throw?std::runtime_error("enqueue?on?stopped?ThreadPool");

????????tasks.emplace([task](){?(*task)();?});
????}
????condition.notify_one();
????return?res;
}

//?the?destructor?joins?all?threads
inline?ThreadPool::~ThreadPool()
{
????{
????????std::unique_locklock(queue_mutex);
????????stop?=?true;
????}
????condition.notify_all();
????for(std::thread?&worker:?workers)
????????worker.join();
}

#endif

基本使用方法

#include#include?"ThreadPool.h"

int?main()
{
????//?create?thread?pool?with?4?worker?threads
????ThreadPool?pool(4);

????//?enqueue?and?store?future
????auto?result?=?pool.enqueue([](int?answer)?{?return?answer;?},?42);

????//?get?result?from?future,?print?42
????std::cout?<<?result.get()?<<?std::endl;?
}

另一個例子

#include#include?"ThreadPool.h"

void?func()
{
????std::this_thread::sleep_for(std::chrono::milliseconds(100));
????std::cout<<"worker?thread?ID:"<<std::this_thread::get_id()<<std::endl;
}

int?main()
{
????ThreadPool?pool(4);
????while(1)
????{
???????pool.enqueue(fun);
????}
}


可以看出,四個線程都在運行。但是如果把func()中的延時放在main()的while循環(huán)中,就只有一個線程在運行了。

線程池,最簡單的就是生產(chǎn)者消費者模型了。池里的每條線程,都是消費者,他們消費并處理一個個的任務,而任務隊列就相當于生產(chǎn)者了。

線程池最簡單的形式是含有一個固定數(shù)量的工作線程來處理任務,典型的數(shù)量是std::thread::hardware_concurrency()

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉