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...