C++高性能多線程任務(wù)隊(duì)列系統(tǒng)的實(shí)現(xiàn),可以寫進(jìn)簡(jiǎn)歷的項(xiàng)目
0. 需求
1. 項(xiàng)目功能概述
這是一個(gè)高性能的多線程任務(wù)隊(duì)列系統(tǒng),主要提供以下功能:
- 支持多個(gè)命名任務(wù)隊(duì)列的創(chuàng)建和管理
- 支持異步任務(wù)的提交和執(zhí)行
- 支持延遲任務(wù)的調(diào)度
- 保證任務(wù)的FIFO(先進(jìn)先出)順序執(zhí)行
- 支持多線程并發(fā)提交任務(wù)
- 線程安全的任務(wù)管理
開源項(xiàng)目源地址: https://github.com/ouxianghui/task-queue.git
視頻講解:別盯著C++線程池了,來看看C++高性能多線程任務(wù)隊(duì)列系統(tǒng)的實(shí)現(xiàn),可以寫進(jìn)簡(jiǎn)歷的項(xiàng)目
(非老廖開源,老廖這里只是加以分析和改進(jìn),讓大家更容易掌握)
2 整體設(shè)計(jì)思路
- 單例模式設(shè)計(jì)
- TaskQueueManager 采用單例模式
- 使用 std::once_flag 確保線程安全的初始化
- 通過全局宏 TQMgr 提供便捷訪問
- 線程安全考慮
- 使用互斥鎖保護(hù)隊(duì)列映射表
- 所有對(duì)隊(duì)列表的操作都是線程安全的
- 使用智能指針管理資源生命周期
- 任務(wù)隊(duì)列管理
- 使用 unordered_map 存儲(chǔ)命名任務(wù)隊(duì)列
- 支持動(dòng)態(tài)創(chuàng)建和管理多個(gè)隊(duì)列
- 每個(gè)隊(duì)列都是獨(dú)立的執(zhí)行單元
3. 核心組件設(shè)計(jì)
3.1 系統(tǒng)架構(gòu)圖
不同的隊(duì)列使用的線程是獨(dú)立的,可以根據(jù)不同的業(yè)務(wù)投遞到對(duì)應(yīng)的隊(duì)列,比如有些隊(duì)列專門執(zhí)行耗時(shí)的任務(wù)。
3.2 核心組件說明
TaskQueueManager
- 全局單例管理器
- 管理多個(gè)命名任務(wù)隊(duì)列
- 提供隊(duì)列的創(chuàng)建、獲取、檢查等功能
- 線程安全的隊(duì)列管理
TaskQueue
- 任務(wù)隊(duì)列的高層封裝
- 提供任務(wù)提交接口
- 支持普通任務(wù)和延遲任務(wù)
- 支持Lambda表達(dá)式和自定義任務(wù)
TaskQueueBase
- 任務(wù)隊(duì)列的底層實(shí)現(xiàn)
- 管理任務(wù)的實(shí)際執(zhí)行
- 保證任務(wù)的FIFO順序
QueuedTask
- 任務(wù)的基類
- 支持自定義任務(wù)實(shí)現(xiàn)
- 提供任務(wù)執(zhí)行接口
TaskQueueSTD
- 單獨(dú)的工作線程
- 支持即時(shí)任務(wù)和延遲任務(wù)
- FIFO(先進(jìn)先出)執(zhí)行順序
- 基于事件的任務(wù)通知機(jī)制
- 線程安全的任務(wù)管理
4. 工作流程圖
5. 類關(guān)系圖
6. 關(guān)鍵特性實(shí)現(xiàn)
6.1 任務(wù)提交
6.2 延遲任務(wù)處理
7. 本項(xiàng)目C++新特性使用要點(diǎn)
現(xiàn)代C++特性在項(xiàng)目中的使用原因和優(yōu)勢(shì):
std::unique_ptr 的使用
void postTask(std::unique_ptr<QueuedTask> task);
使用原因:
- 明確所有權(quán)語義:任務(wù)隊(duì)列接管任務(wù)的所有權(quán)
- 防止內(nèi)存泄漏:智能指針自動(dòng)管理資源釋放
- 避免共享所有權(quán):任務(wù)只能被一個(gè)隊(duì)列持有和執(zhí)行
- 強(qiáng)制移動(dòng)語義:不能意外地復(fù)制任務(wù)
- 零開銷抽象:性能與原始指針相當(dāng)
std::move 的使用
pending_queue_.push(std::pair<OrderId, std::unique_ptr<QueuedTask>>(order, std::move(task)));
使用原因:
- 避免不必要的復(fù)制:直接轉(zhuǎn)移資源所有權(quán)
- 提高性能:減少內(nèi)存分配和復(fù)制操作
- 配合 unique_ptr:實(shí)現(xiàn)資源的轉(zhuǎn)移
- 確保資源安全:防止多次釋放同一資源
std::forward 的使用
template <class Closure> void postTask(Closure&& closure) { postTask(ToQueuedTask(std::forward<Closure>(closure))); }
使用原因:
- 完美轉(zhuǎn)發(fā):保持參數(shù)的值類別(左值/右值)
- 支持通用引用:使模板更靈活
- 優(yōu)化性能:避免不必要的復(fù)制
- 類型推導(dǎo):支持不同類型的任務(wù)封裝
string_view 的使用
TaskQueueSTD(std::string_view queueName);
使用原因:
- 性能優(yōu)化:避免字符串復(fù)制
- 靈活性:可以接受字符串字面量、std::string等多種類型
- 只讀訪問:明確表明不會(huì)修改字符串
- 零開銷抽象:不會(huì)產(chǎn)生額外的內(nèi)存分配
其他現(xiàn)代C++特性的使用
a. Lambda表達(dá)式
thread_ = std::thread([this]{ CurrentTaskQueueSetter setCurrent(this); this->processTasks(); });
- 簡(jiǎn)化代碼:方便地創(chuàng)建臨時(shí)函數(shù)對(duì)象
- 捕獲上下文:訪問外部變量
- 提高可讀性:就地定義行為
b. RAII模式
std::unique_lock<std::mutex> lock(pending_mutex_);
- 資源安全:自動(dòng)管理資源的生命周期
- 異常安全:確保資源正確釋放
- 簡(jiǎn)化代碼:避免手動(dòng)加鎖解鎖
c. 類型推導(dǎo)(auto)
auto tick = milliseconds();
- 簡(jiǎn)化代碼:避免冗長(zhǎng)的類型聲明
- 維護(hù)性:類型變化時(shí)無需修改代碼
- 泛型編程:支持模板和泛型算法
總體設(shè)計(jì)意圖
- 安全性:
- 使用智能指針避免內(nèi)存泄漏
- 強(qiáng)制所有權(quán)語義防止資源誤用
- RAII確保資源正確管理
- 性能:
- 移動(dòng)語義避免不必要的復(fù)制
- string_view減少字符串開銷
- 零開銷抽象保持高效性
- 可維護(hù)性:
- 現(xiàn)代C++特性提高代碼可讀性
- 類型安全減少錯(cuò)誤
- 自動(dòng)化資源管理簡(jiǎn)化代碼
- 靈活性:
- 模板和完美轉(zhuǎn)發(fā)支持多種任務(wù)類型
- Lambda表達(dá)式簡(jiǎn)化任務(wù)定義
- 通用引用支持不同參數(shù)類型
這些特性的使用體現(xiàn)了現(xiàn)代C++的最佳實(shí)踐,既保證了代碼的安全性和性能,又提高了可維護(hù)性和靈活性。
#簡(jiǎn)歷中的項(xiàng)目經(jīng)歷要怎么寫##校招##簡(jiǎn)歷被掛麻了,求建議##C++##后端開發(fā)#