一.執行緒最主要的三個同步機制
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...