threadpool.hpp
#ifndef __m_pool_h__
#define __m_pool_h__
#include
#include
#include
#include
#include
#include
#define max_thread 3
#define max_queue 10
class
mytask
~mytask()
void
setdata
(int _data)
void
run()}
;class
mythreadpool
void
threadunlock()
void
consumerwait()
void
consumernotify()
void
producterwait()
void
producternotify()
bool
threadisrunning()
void
threadexit()
bool
queueisempty()
bool
queueisfull()
void
poptask
(mytask *
*task)
void
pushtask
(mytask *task)
static
void
*thread_routine
(void
*arg)
//若當前是非執行狀態,且沒有任務則退出執行緒
//若當前時非執行狀態,但是佇列中有任務則需要將任務執行完畢後才能退出if(
!pthreadpool-
>
threadisrunning()
&& pthreadpool-
>
queueisempty()
)//能夠走下來,則任務佇列不為空,那麼獲取乙個任務執行
mytask *task;
pthreadpool-
>
poptask
(&task)
; pthreadpool-
>
producternotify()
; pthreadpool-
>
threadunlock()
;//執行任務,不能在鎖內,否則導致其它執行緒飢餓
task-
>
run();
}return
null;}
public
:mythreadpool
(int _max_thread = max_thread,
int _max_queue= max_queue)
:max_thread
(_max_thread)
,max_queue
(_max_queue)
,cur_thread
(_max_thread)
,keep_running(1
)pthread_detach
(tid[i]);
}}~mythreadpool()
//向執行緒池任務佇列中新增任務
bool
addtasktopool
(mytask *task)
pushtask
(task)
;printf
("add task to pool\n");
consumernotify()
;threadunlock()
;return
true;}
void
stopthreadpool()
threadlock()
; keep_running =0;
//如果還有執行緒沒有退出,則掛起等待
//等待所有執行緒將佇列中的所有任務都執行完畢後並且退出
linux 執行緒(六 讀寫鎖
讀者 寫者問題的變種問題,每個都是基於讀者和寫者的優先順序 適用的場景 少量寫 大量讀 與互斥量類似,但讀寫鎖允許更高的並行性。其特性為 寫獨佔,讀共享。讀寫鎖的三種狀態 讀模式下的加鎖狀態 寫模式下的加鎖狀態 不加鎖的狀態 加鎖規則寫 讀 計數變數的作用 在於判斷釋放讀模式開啟的讀寫鎖的,是否能夠...
Linux多執行緒學習(六)pthread once
int pthread once pthread once t once control,void init routine void 引數 once control 控制變數 init routine 初始化函式 返回值 若成功返回0,若失敗返回錯誤編號。型別為pthread once t的變數是...
POSIX執行緒 (六)
執行緒屬性 排程 下面我們來看一下我們也許希望改變的第二個執行緒屬性 排程。改變排程屬性與設定分離屬性相類似,但是我們可以使用另外兩個函式來查詢可用的等級級別,sched get priority max與sched get priority min。試驗 排程 因為thread6.c是與前面的例子...