前情提要 C++ 記憶體共分為三區:1. 靜態(static):儲存「全域變數」與「靜態變數」,會存活至整段程式結束為止。2. 堆疊(stack):儲存「區域變...
Day 17 的文章曾經為了鋪陳 volatile 關鍵字用法,做了些執行緒的超入門介紹,但執行緒主題其實還有好多內容,就從這篇開始細細探討。 Day 17 文...
多執行緒讓 CPU 可以同時多工工作,雖然可以提升 CPU 使用效率、減少資源浪費,但也潛藏著風險,其中最著名的為「資料競爭(data race)」。 註:可能...
Day 23 的文章講到如果多執行緒共用同一個記憶體資源,且至少一個執行緒有寫入行為的話,會導致資料競爭,跑出不在預期中的結果,本篇文章就要來探討解決方法。 第...
以往初學「競賽條件(race condition)」時,用的其實都是 Day 23 提到的「資料競爭(data race)」當例子,但在本次參加鐵人賽的過程中,...
前面介紹了互斥鎖可以避免資料競爭,但如果複數個執行緒都把持著某些資源、卻也都同時在等待其他執行緒手上的資源,就會形成「死結(deadlock)」。 死結形成的四...
除了死鎖,還有其他可能會讓程式卡住,一個是「活鎖(livelock)」、另一個是「飢餓(starvation)」。 活鎖 Livelock 有別於「死鎖」是複數...
在多執行緒下,編譯器或 CPU 可能為了追求效能而重排指令順序,導致實際執行的結果與預期不同,因此需要「記憶體模型(memory model)」來規範不同執行緒...
從 C++ 11 開始,C++ 可以用 async / promise 跟 future 實現非同步操作,本文將以超簡單範例說明相關用法,首先是較為簡潔的 as...
在需要很多執行緒幫忙處理工作時,如果每次都開一個新執行緒、用完再銷毀顯得非常浪費,不如直接準備好一批執行緒,看誰有空就請誰做事,這批「先被準備好、待命中的執行緒...