libuv工作佇列

2022-01-17 05:53:02 字數 1770 閱讀 3143

目錄3、**示例

libuv 中的執行緒池在內部用於執行所有檔案系統操作以及getaddrinfo()getnameinfo()請求

libuv 中的執行緒池的預設數量為4,可以在啟動時修改環境變數uv_threadpool_size來修改,最大值為 1024(1.30.0版本之前是128)

libuv 中的執行緒池是全域性的,並在所有事件迴圈之間共享,當特定的函式利用uv_queue_work()方法使用工作佇列時,libuv 會預分配執行緒池,以較小的記憶體開銷(128個執行緒為1mb),來提高執行緒效能

以下三種型別的操作會在全域性執行緒池中進行:

檔案系統操作;

dns函式(getaddrinfo 和 getnameinfo);

使用uv_queue_work()排程的使用者**;

需要注意的是,即使使用了執行緒池,libuv 的方法也不是執行緒安全的

int uv_queue_work(uv_loop_t* loop, 

uv_work_t* req,

uv_work_cb work_cb,

uv_after_work_cb after_work_cb);

新增乙個任務到工作佇列中,在主線程中呼叫

loop: 事件迴圈

req: 傳入到任務的資料,一般使用 req.data 引數傳遞

work_cb: 執行方法

after_work_cb: 執行方法完成後執行

work_cb方法會在函式中執行,after_work_cb方法在建立執行緒中執行

void (*uv_work_cb)(uv_work_t* req);

void (*uv_after_work_cb)(uv_work_t* req, int status);

如果呼叫uv_cancel方法取消了佇列,則uv_after_work_cbstatusuv_ecanceled

int uv_cancel(uv_req_t* req);
取消未執行的佇列中的任務,在任務中呼叫

req為任務的引數

如果呼叫此方法取消了任務,則after_work_cb**函式的status的值為uv_ecanceled

#include #include #include #include void print(uv_work_t *req)

void after_print(uv_work_t *req, int status)

int main()

return uv_run(loop, uv_run_default);

}

示例中的**,每次執行print()方法都是在不同執行緒中,after_print()方法和main()方法在同乙個執行緒中

工作佇列分析

一 用法 struct cpu workqueue struct cacheline aligned the externally visible workqueue abstraction is an array of per cpu workqueues struct workqueue str...

工作佇列模型

workqueue,中文稱其為工作佇列,是乙個用於建立核心執行緒的介面,通過它建立的核心執行緒來執行核心其他模組排列到佇列裡的工作,建立的核心執行緒被稱為工作者執行緒。要理解工作佇列的實現,重點在於理解相關的三個資料結構的含義及關係。1 表示工作佇列型別的資料結構 struct workqueue ...

工作佇列分析

一 用法 struct cpu workqueue struct cacheline aligned the externally visible workqueue abstraction is an array of per cpu workqueues struct workqueue str...