C++ 11 幾個特性的整理
std::future - std::promise
解決的問題
返回值的異步獲让挥印:我們送一個任務到線程中去執(zhí)行的時候,大部分時候是關心任務(就是函數(shù)啦)的返回值的温赔。因為是起線程去執(zhí)行蛤奢,并不能向單線程同步執(zhí)行那樣簡單,考慮到線程同步陶贼,自己實現(xiàn)至少需要一個返回值啤贩,一個狀態(tài)標識,與相應的同步代碼拜秧。
std::future提供了存儲異步值的一個基礎設施,包括了剛才說的值枉氮,狀態(tài)志衍,以及同步機制。
std::promise類內包含了future實例聊替。
實踐中教科書的用法就是楼肪,主線程聲明promise,獲取其future惹悄,然后把promise當成參數(shù)送到子線程執(zhí)行春叫,主線程在合適的位置調用future.wait(),wait_for()... get()來獲取返回值。
參考
condition_variable
解決的問題
并發(fā)任務處理臨界區(qū)時泣港,需要某種條件就緒了之后再處理暂殖,每個線程不斷查詢條件是否滿足,CPU做了很多無用功当纱,condition_variable讓所有等待它的線程去阻塞呛每,直到被喚醒。
- 因為等待條件變量的線程是阻塞等待的惫东,不參與cpu調度(回想一下進程狀態(tài)圖)莉给,這樣有助于效率。
- 條件滿足后被喚醒是通過鎖串行處理臨界區(qū)的廉沮。
參考
std::function
解決的問題
std::function是一個通用的函數(shù)包裝器颓遏,主要解決的問題是延遲執(zhí)行,教科書式的使用就是callback函數(shù)
std::function<R(args..)>:R - 返回值滞时, args - 參數(shù)叁幢。
參考
std::packaged_task
解決的問題
packaged_task跟function很像,都是可執(zhí)行對象包裝器的作用坪稽,不同在于曼玩,function的返回值必須是即時的鳞骤,而packaged_task內藏一個future對象,可以獲取異步返回結果黍判。