Linux執行緒(六)

2021-10-02 04:42:07 字數 2398 閱讀 3072

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是與前面的例子...