iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
Software Development

山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑系列 第 23

DAY22:緩解開發多緒程式的痛楚—std::thread

在 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 還提供了其他用來開發多緒程式的組件,留待下一篇再來談。


上一篇
DAY 21:讓跨平台檔案及目錄處理更輕鬆的 std::filesystem
下一篇
DAY23:更高層次的多緒組件 Task-based Programming
系列文
山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言