C++線(xiàn)程池是一種多線(xiàn)程管理模型,把線(xiàn)程分成任務(wù)執(zhí)行和線(xiàn)程調(diào)度兩部分。線(xiàn)程任務(wù)被放入工作隊(duì)列中,工作線(xiàn)程通常會(huì)輪詢(xún)這個(gè)隊(duì)列從而獲取任務(wù)并執(zhí)行。這種機(jī)制實(shí)現(xiàn)的目標(biāo)是將線(xiàn)程的創(chuàng)建、銷(xiāo)毀都由線(xiàn)程池來(lái)完成,節(jié)省了線(xiàn)程切換開(kāi)銷(xiāo)。
正常情況下,我們啟動(dòng)一個(gè)線(xiàn)程的流程需要進(jìn)行以下操作:
1.申請(qǐng)系統(tǒng)資源,并創(chuàng)建新的線(xiàn)程
2.設(shè)置線(xiàn)程特性,如棧大小等參數(shù)
3.執(zhí)行線(xiàn)程任務(wù)
4.結(jié)束線(xiàn)程,釋放資源
而使用線(xiàn)程池則可以減少這些步驟,因?yàn)榫€(xiàn)程池中已經(jīng)預(yù)先創(chuàng)建了一定數(shù)量的線(xiàn)程,這些線(xiàn)程處于等待狀態(tài),能夠在有任務(wù)時(shí)立即響應(yīng)處理。具體來(lái)說(shuō),C++線(xiàn)程池可以提供以下優(yōu)點(diǎn):
- 對(duì)于頻繁創(chuàng)建、刪除線(xiàn)程的場(chǎng)景,使用線(xiàn)程池能夠減輕系統(tǒng)負(fù)擔(dān),避免花費(fèi)過(guò)高的時(shí)間和內(nèi)存開(kāi)銷(xiāo)。
- C++線(xiàn)程池可以通過(guò)限制線(xiàn)程的最大數(shù)量、保留一些線(xiàn)程反復(fù)利用等方式避免線(xiàn)程數(shù)目暴增導(dǎo)致的問(wèn)題。
- 線(xiàn)程池可以有效的處理任務(wù)隊(duì)列,并優(yōu)化任務(wù)處理的順序和方式,從而使任務(wù)處理效率提高。
C++線(xiàn)程池在操作系統(tǒng)并發(fā)編程中起到了重要的作用,對(duì)于多線(xiàn)程服務(wù)器開(kāi)發(fā)、網(wǎng)絡(luò)編程等場(chǎng)景具有非常廣泛的實(shí)際應(yīng)用。
下面是C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線(xiàn)程池的示例代碼,該線(xiàn)程池可以自動(dòng)管理任務(wù)隊(duì)列、工作線(xiàn)程和互斥鎖。
#include < thread >
#include < mutex >
#include < queue >
#include < condition_variable >
// 定義任務(wù)類(lèi)型
typedef std::function< void() > Task;
class ThreadPool {
public:
// 構(gòu)造函數(shù),默認(rèn)啟動(dòng)4個(gè)工作線(xiàn)程
ThreadPool(int numThreads = 4)
: m_stop(false)
{
for (int i = 0; i < numThreads; ++i)
m_workers.emplace_back(
[this] {
for (;;) {
Task task;
{
std::unique_lock< std::mutex > lock(this- >m_mutex);
this- >m_cond.wait(lock, [this] { return this- >m_stop || !this- >m_tasks.empty(); });
if (this- >m_stop && this- >m_tasks.empty())
return;
task = std::move(this- >m_tasks.front());
this- >m_tasks.pop();
}
task();
}
}
);
}
// 刪除默認(rèn)構(gòu)造函數(shù)
ThreadPool() = delete;
// 添加新的任務(wù)到任務(wù)隊(duì)列中
template< class F >
void enqueue(F&& f)
{
{
std::unique_lock< std::mutex > lock(m_mutex);
m_tasks.emplace(std::forward< F >(f));
}
m_cond.notify_one();
}
// 停止線(xiàn)程池運(yùn)行
~ThreadPool()
{
{
std::unique_lock< std::mutex > lock(m_mutex);
m_stop = true;
}
m_cond.notify_all();
for (std::thread &worker: m_workers)
worker.join();
}
private:
// 工作線(xiàn)程池
std::vector< std::thread > m_workers;
// 任務(wù)隊(duì)列
std::queue< Task > m_tasks;
// 互斥鎖
std::mutex m_mutex;
// 條件變量
std::condition_variable m_cond;
// 停止標(biāo)志
bool m_stop;
};