實現乙個執行緒池

2021-07-10 21:16:13 字數 2427 閱讀 5321

一.執行緒最主要的三個同步機制

1.訊號量

2.互斥鎖

3.條件變數

二.對三個同步機制分別實現乙個包裝類

#ifdef locker_h

#define locker_h

#include #include /*訊號量的封裝*/

class sem

}~sem()

bool wait()

bool post()

private:

sem_t sem_like;

}/*互斥鎖的封裝*/

class locker

}~locker()

bool lock()

bool unlock()

private:

pthread_mutex_t mutex_like;

}/*條件變數的封裝*/

class cond

if( pthread_cond_init( &cond_like, null)!= 0)

}~cond()

bool wait()

bool signal()

private:

pthread_mutex_t mutex_like;

pthread_cond_t cond_like;

}#endif

三.實現執行緒池

動態建立執行緒十分消耗時間,如果有乙個執行緒池,使用者請求到來時,從執行緒池取乙個空閒的執行緒來處理使用者的請求,請求處理完後,執行緒又變為空閒狀態,等待下次被使用。

核心資料結構有兩個:執行緒容器 、請求佇列

1.執行緒容器

這裡用乙個vector容器來存放執行緒池裡面所有執行緒的id

2.請求佇列

這裡用list容器來存放所有請求,請求處理按fifo的順序

#ifndef threadpool_h

#define threadpool_h

#include #include #include #include #include "locker.h"

template< typename t >

class threadpool

;template< typename t >

threadpool< t >::threadpool( int thread_number, int max_requests ) :

m_thread_number( thread_number ), m_max_requests( max_requests ), m_stop( false ), m_threads( null )

threads_like.resize( thread_number_like);

if( thread_number_like!= threads_like.size() )

for ( int i = 0; i < thread_number_like; ++i )

if( pthread_detach( m_threads[i] ) )//設定為脫離執行緒

}}template< typename t >

threadpool< t >::~threadpool()

template< typename t >

workqueue_like.push_back( request );

queuelocker_like.unlock();

queuestat_like.post();

return true;

}template< typename t >

void* threadpool< t >::worker( void* arg )

template< typename t >

void threadpool< t >::run()

t* request = workqueue_like.front();

workqueue_like.pop_front();

queuelocker_like.unlock();

if ( ! request )

request->process();//執行當前請求所對應的處理函式

}}#endif

注:1.這裡的執行緒池模型中,每乙個執行緒對應乙個請求

2.這種方式保證了使用者請求的及時處理,對請求的處理函式效能要求更小,因為這種模型並不要求請求處理過程是非堵塞的,因為乙個請求的處理時延不會影響到系統對其他請求的處理(當然執行緒數必須能動態增加)。

3.這種方式對於高併發伺服器並不是最優的,類似於nginx的乙個程序對應多個使用者請求的方式更有優勢,nginx模型的優勢主要有兩個:一:程序數固定,不會因為同時有很多執行緒或者程序而占用過多的記憶體。二:nginx的工作程序數一般與cpu的核數一致,並可以把乙個程序繫結到乙個核上,這樣就節省了程序切換或執行緒切換帶來的系統開銷

執行緒池(一) 實現乙個簡單的執行緒池

我們知道頻繁的建立 銷毀執行緒是不可取的,為了減少建立和銷毀執行緒的次數,讓每個執行緒可以多次使用,我們就可以使用執行緒池,可以降低資源到的消耗。執行緒池裡面肯定有多個執行緒,那麼我們就簡單的用乙個陣列來儲存執行緒,那我們我們預設裡面有 5 個執行緒。那我們執行緒池裡只有五個執行緒能同時工作,那同時...

乙個簡單的執行緒池實現

乙個linux下簡單的執行緒池實現 實現了大部分邏輯,有部分邏輯未實現,只是提供乙個思路 執行緒池類 threadpool.h created on oct 13,2016 author luokun ifndef threadpool h define threadpool h include i...

實現乙個簡易的執行緒池。

定義四個類 乙個內部類 乙個任務類 乙個測試類 乙個執行緒池類包含乙個內部類。任務類 任務類,檢查埠。author administrator public class scannertask public void starttask catch unknownhostexception e ca...