C 中基於Task的執行緒池實現

2021-10-25 05:17:04 字數 3483 閱讀 4426

**實現

實現思路

更多擴充套件

在日常開發中總是免不了接觸到後台任務,如:定時清理、socket通訊等。一般來說後台任務根據執行緒模型可以分為:單執行緒、多執行緒、執行緒池。

如果後台任務需要嚴格按時序進行,而且任務和任務之間不能並行處理的話,應該選用單執行緒實現。

如果後台任務之間可以並行處理就可以選用多執行緒模式實現,因為執行緒的開啟和銷毀都是需要資源的,所以有如下公式:

執行總消耗 = 開啟執行緒消耗 + 任務消耗 + 銷毀執行緒消耗

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列然後通知提前建立好的工作執行緒,然後工作執行緒再從任務佇列中獲取任務並執行。根據上面的公式,執行緒池是提前建立好一定數量的工作執行緒,所以執行緒的開啟和銷毀消耗已經是固定了,適合任務量大的任務型別。

**先上為敬。

1.jobresult.cs

/// 

/// 工作執行結果

///

public

class

jobresult

///

/// 返回資訊

///

public

string message

///

/// 可能會有的附加資料

///

public

object data

public

jobresult()

public

void

operatefail

(string msg)

}

2.basejob.cs

/// 

/// 工作項基類

///

public

abstract

class

basejob

catch

(exception ex)

finished?

.invoke

(this

, result);}

public

abstract

jobresult

execute()

;}

3.mythreadpoolconfig.cs

/// 

/// 執行緒池配置

///

public

class

mythreadpoolconfig

///

/// 執行緒數

///

public

byte threadcount

public

mythreadpoolconfig()

}

4.mythreadpool

/// 

/// 執行緒池**實現

///

public

class

mythreadpool

:idisposable

///

/// 建立執行緒池

///

/// 配置

///

public

static

mythreadpool

create

(action config)

public

void

dispose()

///

/// 執行執行緒池

///

///

public

mythreadpool

run(

)return

this;}

///

/// 向工作佇列加入工作項

///

/// 工作項

public

void

jobenqueue

(basejob job)

m_sem.

release()

; m_queue.

enqueue

(job);}

private

void

work()

}}lock

(m_queue)

if(m_exitcnt == m_cfg.threadcount)

}}

測試**

...

public

void

test()

).run();

pool.

jobenqueue

(job1)

; pool.

jobenqueue

(job2)

; pool.

jobenqueue

(job3)

; pool.

jobenqueue

(job4)

; console.

readkey()

; pool.

dispose()

; console.

readkey()

;}..

.public

class

testjob

:basejob

public

override

jobresult

execute()

] execute by ");

task.

delay

(1000).

wait()

; result.message =

"success"

;return result;

}private

void

onbegin

(basejob job)

begin run");

}private

void

onfinish

(basejob job,

jobresult result)

done:");

}}

1.重試機制

在c#中訊號量是有最大值的,也就意味著我們的任務佇列也是有最大長度的。當新任務入隊時如果任務佇列長度已經到達了最大值,就會冒出semaphorefullexception異常。這時我們可以在外部稍微等待個零點幾秒再重試。

2.任務優先順序

我們可以在任務項中新增優先順序字段,每次獲取任務項都優先取優先順序較高的任務項。但是這樣的話就不能使用concurrentqueue< t >型別作為任務佇列了,因為佇列必須是先進先出,而優先順序的存在則會破壞先進先出的規則,所以我們應該選用其他集合型別實現,並保證執行緒安全,必要時使用lock關鍵字。

c 執行緒 執行緒池和Task關係

環境 執行緒 thread,由clr提供,可以提供細粒度的執行緒控制,但是在返回值 多個執行緒並行 序列時候顯得功能不足,需要進一步封裝才行,而且執行緒的開啟 停止都需要時間開銷,亂用的話還造成浪費。執行緒池 threadpool,由clr提供,提供粗粒度的執行緒控制,主要用來執行短時間內執行的 片...

基於C 11 14 17的執行緒池實現

為了擁抱新標準,盡量使用了c 14 17的特性,所以如果需要編譯執行這些 的話,需要啟用你的編譯器的c 17特性。class threadpool thread pool threadpool threadpool const size t max threads closed false paus...

基於C 11實現的執行緒池

最近在整理之前寫的一些東西,方便以後檢視 實現的主要原理是 乙個同步佇列,外部往同步佇列裡新增任務,然後喚醒執行緒有任務需要處理,執行緒取出任務即可。同步佇列 syncquene.hpp include include include templateclass syncquene bool ful...