在 C++ 的情境下講的多緒程式設計,總會提到這篇有名的文章《The Free Lunch Is Over》,作者正是那位無人不知曉的 Herb Sutter,該篇文章發佈於 2005 年,夭壽已經是十四年前的事了。
該文探討的是,以往靠 CPU 廠商加快單核心運算能力來增加軟體執行效能時代已經結束,取而代之的是多核心運算,而軟體要持續提昇效能,必須充份利用硬體的多核心特性,開發多執行緒的應用程式。
多緒程式要寫得好不容易,除了追求高效,品質方面也要顧到。眾所周知,多緒程式不好寫,而且臭蟲不好抓,出問題的地方過於隱晦時,會讓 DEBUG 到沒什麼求生欲。
C++11 引入幾個可用來開發多緒程式的組件,這一篇先談較底層的關件零組件—std::thread。
主流的作業系統皆有自己的多緒函式庫。std::thread 這個標準介面,讓開發不論在哪一個平台,都只要面對一種介面,一個開發零組件。底下示範一個簡單的 std::thread 用法:
std::thread long_running([]()
{
NeverStopLearning();
});
std::thread adult20s([]()
{
PursueHisOrHerDream();
});
adult20s.detach();
long_running.join();
上例中的 adult20s.detach()
等於「射後不理」或「放牛吃草」,任由該執行緒自生自滅(有點浮誇,但意思差不多了)。反觀 long_running.join()
則會等到該執行緒完成後才返回。
std::thread
可當做一般物件來管理,多個執行緒物件放在同一個 Container 管理,或當做參數傳遞,就看開發者如何應用了。
上例中也使用了 Lambda
寫法,由此可見引入 Lambda 後對這個老語言帶來多大的影響。
C++11 還提供了其他用來開發多緒程式的組件,留待下一篇再來談。