**實現
實現思路
更多擴充套件
在日常開發中總是免不了接觸到後台任務,如:定時清理、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...