因為多執行緒對於cpu的高效利用 好幾種高效能的伺服器框架都使用了多執行緒 但執行緒的建立和**是非常浪費系統資源的 常常會有不必要的時間損失 但我們的伺服器的硬體確相對來說非常充裕 於是我們可以初始化一組資源 在伺服器執行階段可以直接獲取而不需要重新分配 相對的在乙個邏輯單元執行完以後也不需要釋放資源 從而大大提高了效率 避免了對核心的頻繁訪問 這裡我們說的資源就是執行緒 初始化的這一組資源可以看做是乙個執行緒池
執行緒池基本原理threadpool.h
#ifndef threadpool_h_
#define threadpool_h_
#include
"locker.h"
#include
#include
#include
#include
#include
template
<
typename t>
void
solve
(const t &t)
template
<
typename t>
class
threadpool
;public
:explicit
threadpool
(int thread_number = max_thread,
int max_requests = max_requests);~
threadpool()
;bool
(t* request)
;//向任務佇列中新增任務
private
:static
void
*worker
(void
*arg)
;void
run();
private
:int m_thread_number;
//最大執行緒數
int m_max_requests;
//最大請求數
pthread_t* m_threads;
//描述執行緒的陣列
//unique_ptrm_threads; //如果確定陣列大小 就可以用unique_ptr管理記憶體
std::list> m_workqueue;
//任務佇列
cond m_queuestate;
//條件變數 類內初始化
bool m_stop;
//直接類內預設初始化失敗};
template
<
typename t>
threadpool
::threadpool
(int thread_number,
int max_requests)
:m_thread_number
(thread_number)
,m_max_requests
(max_requests)
,m_stop
(false),
m_threads
(null),
m_queuestate()
m_threads =
new pthread_t[m_thread_number];if
(!m_threads)
//typedef void* (*temp)(void*);
using temp =
void*(
*)(void*)
; temp enp =
(temp)
&threadpool::run;
for(
int i=
0;i++i)if(
int ret =
pthread_detach
(m_threads[i]))
}}template
<
typename t>
threadpool::~
threadpool()
template
<
typename t>
bool threadpool
::(t* requests)
m_workqueue.
emplace_back
(requests)
; m_queuestate.
signal()
; m_queuestate.
unlock()
;return
true;}
template
<
typename t>
//這個函式本來為pthread_create的引數準備的 但有更好的解決方案 及強制型別轉換
void
* threadpool
::worker
(void
*arg)
template
<
typename t>
void threadpool
::run()
t* request = m_workqueue.
front()
; m_workqueue.
pop_front()
; m_queuestate.
unlock()
;//這裡就是執行緒得到這個引數後如何執行
std::cout <<
pthread_self()
<< std::endl;
solve
(*request);}
}#endif
locker.h
#ifndef locker_h_
#define locker_h_
#include
#include
#include
//訊號量
class
locker}~
locker()
bool
lock()
bool
unlock()
private
: pthread_mutex_t m_mutex;};
class
condif(
pthread_cond_init
(&m_cond,
nullptr)!=
0)}~
cond()
bool
signal()
bool
wait()
bool
lock()
bool
unlock()
private
: pthread_mutex_t m_mutex;
pthread_cond_t m_cond;};
#endif
test_for_threadpool.cpp
#include
"threadpool.h"
#include
#include
using
namespace std;
int flag,tmp;
intmain()
;//加while的原因是把超過最大請求的重新傳送
//sleep(2);
}return0;
}
linux c 執行緒池 互斥變數 條件變數
執行緒池主要實現模組multithreadtest.c include include include include include include typedef struct threadworker typedef struct threadpool static struct thread...
c 執行緒條件變數
此處有兩個執行緒,乙個作為生產者,把資料放入佇列中,乙個作為消費者,把資料從佇列中取出,所以對兩個執行緒而言,這個佇列是共用的,所以要加鎖進行保護。include stdafx.h include include include include include using namespace std...
條件變數實現執行緒同步
1 什麼是條件變數實現執行緒同步?假如我們的程式中有兩個執行緒,乙個是生產者執行緒,另乙個是消費者執行緒,生產者執行緒每隔一段時間把資料寫入到緩衝區buffer中,而消費者執行緒則每隔一段時間從buffer中取出資料,為了避免兩個執行緒讀寫混亂,我們讓生產線執行緒寫完後再通知消費者來讀資料,那麼則可...