Scott Meyers 在《Effective Modern C++》書中 Item 35 條提出,開發多緒程式,在 Thread-Based 以及 Task-Based 之間,應該偏好「後者」。本篇簡單說明 C++11 引入的 std::async
以及 std::future
。
雖然 std::thread
把不同平台之間的多緒程式開發定出一致的介面,但用起來還是過於「低層次」,許多概念對計算機底層原理不甚理解的,容易暈。Task-based 則採取不同切入角度,以類似「任務」的概念來定義。
底下範例程式用到了 std::async
:
TeaShopOwner WhoAccept1Country2Systems();
auto task_force = std::async(WhoAccept1Country2Systems);
//... Sometime in the future
auto the_owner = task_force.get();
上例中,std::async
回傳一個 std::future<TeaShopOwner>
物件,可用來對該任務進行查詢與控制。上例中呼叫了 get()
來取得執行結果。會有兩種情況:
get()
返回值std::async
支援額外的參數用以指定「任務」應該以何種方式被執行—延後執行或非同步。有興趣的讀者可以進一步研究。
多緒程式不好寫,許多「現代化」程式語言針對這個議題做了不少努力,C++ 也不例外。做為一個通用型程式語言,C++11 提供了基礎組件,就看你怎麼好好利用了。