詳解c++ libuv工作隊(duì)列
1、說明
libuv 提供了一個(gè)線程池,可用于運(yùn)行用戶代碼,libuv 中的工作隊(duì)列中的任務(wù)會(huì)在線程池中執(zhí)行
libuv 中的線程池在內(nèi)部用于運(yùn)行所有文件系統(tǒng)操作以及 getaddrinfo() 和 getnameinfo() 請(qǐng)求
libuv 中的線程池的默認(rèn)數(shù)量為4,可以在啟動(dòng)時(shí)修改環(huán)境變量 UV_THREADPOOL_SIZE 來修改,最大值為 1024(1.30.0版本之前是128)
libuv 中的線程池是全局的,并在所有事件循環(huán)之間共享,當(dāng)特定的函數(shù)利用 uv_queue_work() 方法使用工作隊(duì)列時(shí),libuv 會(huì)預(yù)分配線程池,以較小的內(nèi)存開銷(128個(gè)線程為1MB),來提高線程性能
以下三種類型的操作會(huì)在全局線程池中進(jìn)行:
- 文件系統(tǒng)操作;
- DNS函數(shù)(getaddrinfo 和 getnameinfo);
- 使用 uv_queue_work() 調(diào)度的用戶代碼;
需要注意的是,即使使用了線程池,libuv 的方法也不是線程安全的
2、API
2.1、uv_queue_work
int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb);
添加一個(gè)任務(wù)到工作隊(duì)列中,在主線程中調(diào)用
loop: 事件循環(huán)
req: 傳入到任務(wù)的數(shù)據(jù),一般使用 req.data 參數(shù)傳遞
work_cb: 執(zhí)行方法
after_work_cb: 執(zhí)行方法完成后執(zhí)行
work_cb 方法會(huì)在函數(shù)中執(zhí)行,after_work_cb 方法在創(chuàng)建線程中執(zhí)行
void (*uv_work_cb)(uv_work_t* req); void (*uv_after_work_cb)(uv_work_t* req, int status);
如果調(diào)用 uv_cancel 方法取消了隊(duì)列,則 uv_after_work_cb 的 status 為 UV_ECANCELED
2.2、uv_cancel
int uv_cancel(uv_req_t* req);
取消未執(zhí)行的隊(duì)列中的任務(wù),在任務(wù)中調(diào)用
req 為任務(wù)的參數(shù)
如果調(diào)用此方法取消了任務(wù),則 after_work_cb 回調(diào)函數(shù)的 status 的值為 UV_ECANCELED;
3、代碼示例
#include <iostream> #include <pthread.h> #include <unistd.h> #include <uv.h> void print(uv_work_t *req) { sleep(1); long num = (long)req->data; printf("thread id is: %ld, num is: %d\n", uv_thread_self(), num); } void after_print(uv_work_t *req, int status) { printf("after print, req data is %d, status is %d\n", req->data, status); } int main() { uv_loop_t *loop = uv_default_loop(); uv_work_t req[5]; for (int index = 0; index < 5; index++) { req[index].data = (void *)(long)index; uv_queue_work(loop, &req[index], print, after_print); sleep(1); } return uv_run(loop, UV_RUN_DEFAULT); }
示例中的代碼,每次執(zhí)行 print() 方法都是在不同線程中,after_print() 方法和 main() 方法在同一個(gè)線程中
以上就是詳解c++ libuv工作隊(duì)列的詳細(xì)內(nèi)容,更多關(guān)于c++ libuv工作隊(duì)列的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- c++11 多線程編程——如何實(shí)現(xiàn)線程安全隊(duì)列
- 利用C++如何實(shí)現(xiàn)一個(gè)阻塞隊(duì)列詳解
- c++優(yōu)先隊(duì)列用法知識(shí)點(diǎn)總結(jié)
- C++實(shí)現(xiàn)循環(huán)隊(duì)列
- c++優(yōu)先隊(duì)列(priority_queue)用法詳解
- C++基礎(chǔ)學(xué)習(xí)之利用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
- C++用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列(面試官的小結(jié))
- C++基于消息隊(duì)列的多線程實(shí)現(xiàn)示例代碼
- C++ 實(shí)現(xiàn)優(yōu)先隊(duì)列的簡(jiǎn)單實(shí)例
- c++ 隊(duì)列相關(guān)知識(shí)總結(jié)
相關(guān)文章
C++JSON庫CJsonObject詳解(輕量簡(jiǎn)單好用)
CJsonObject是基于cJSON全新開發(fā)一個(gè)C++版的JSON庫,CJsonObject的最大優(yōu)勢(shì)是輕量簡(jiǎn)單好用,開發(fā)效率極高,對(duì)多層嵌套json的讀取和生成使用非常簡(jiǎn)單,喜歡的朋友一起看看吧2021-04-04C語言實(shí)現(xiàn)員工工資管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)員工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02一文帶你學(xué)會(huì)C語言中的qsort函數(shù)
qsort函數(shù)是C語言的庫函數(shù),能實(shí)現(xiàn)對(duì)各種元素類型的比較,使用的基本思想是快速排序法,頭文件是<stdlib.h>,本文不講解具體實(shí)現(xiàn)原理,只對(duì)使用方法進(jìn)行說明,希望對(duì)大家有所幫助2022-12-12c語言簡(jiǎn)單實(shí)現(xiàn)文件 r/w 操作方法
由于在 C 語言中 '\' 一般是轉(zhuǎn)義字符的起始標(biāo)志,故在路徑中需要用兩個(gè) '\' 表示路徑中目錄層次的間隔,也可以使用 '/' 作為路徑中的分隔符,本文重點(diǎn)給大家介紹用c語言簡(jiǎn)單實(shí)現(xiàn)文件 r/w 操作方法,感興趣的朋友一起學(xué)習(xí)吧2021-05-05C語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的掃雷游戲
掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來詳解每一步分析2021-10-10