併發實踐 執行緒池

2021-10-21 02:50:55 字數 1550 閱讀 9251

class

threadpool);

if(_stop)

break

; task = _tasks.

front()

; _tasks.

pop();

}// 必須在解鎖後再呼叫

task()

;}};

// 建立執行緒並啟動

for(

int i =

0; i < _cntthread; i++)}

~threadpool()

}template

<

typename f,

typename..

. args>

auto

commit

(f f, args.

.. args)

-> std::future<

decltype(f

(args...

))>);

} std::cout <<

"task 引用計數:"

<< task.

use_count()

<< std::endl;

_cv.

notify_one()

;return ft;}}

;

細節
std::shared_ptrrettype()

>> task = std::make_sharedrettype()

>

>

( std::

bind

(f, args...

));

1、std::bind

利用函式介面卡std::bind把實參繫結到輸出函式,把真正的任務函式改造成無參函式。目的是執行緒內部對於任何任務,都可以用相同的呼叫方式來啟動任務,同時無需管理傳參。

2、std::packaged_task

std::packaged_task把任務及其未來的執行結果封裝起來,方便任務提交者獲取任務的執**況。如果對任務的執行結果不感興趣,可以去掉這層封裝,也就不用返回std::future物件,甚至不用智慧型指標std::shared_ptr。

template

<

typename f,

typename..

. args>

void

commit

(f f, args.

.. args));

} _cv.

notify_one()

;}

3、std::shared_ptr

如果這裡不用智慧型指標,task變數超出生命週期後就會被析構,會在其關聯的shared state中儲存乙個future_error異常,錯誤碼是broken_promise。當工作者執行緒取出任務並執行完成,需要把執行結果儲存在shared state中時就會丟擲future_error異常,錯誤碼是promise_already_satisfied。

參考基於c++11的執行緒池

併發 執行緒池

學習 1.先大綱,然後思路優先 適當的提出問題 2.合理推測 完成上述需要知識,為了熟悉執行緒池,提出一些問題 1.執行緒什麼時候建立?2.執行緒池主要做什麼?3.無任務執行處於什麼狀態?4.提交乙個任務,執行邏輯?5.執行緒池怎樣被銷毀?回答問題 1.執行緒在執行 excute方法 中,做系列判斷...

併發7 執行緒池

用優雅的方式理解和使用執行緒池 執行緒池的目的 1 減少系統維護執行緒的開銷 2 解耦,執行和建立分開 3 執行緒可以復用 執行緒池的使用 1 介面executor 提供方法execute runnable 執行執行緒命令 2 介面executorservice 提供方法shutdown 啟動一次順...

併發程式設計 執行緒池與程序池

以時間換空間 程序池 乙個容器,這個容器限制住你開啟程序的數量,預設是os.cpu count 我的電腦是8核,所以能開啟8個,第一次肯定只能並行的處理8個任務,只要有任務完成,程序馬上就會接下乙個任務。實現 from concurrent.futures import processpoolexe...