什麼是線?
進程內實際執行程式碼的流程
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
如果進程是保存記憶體和檔案等資源的容器,那麼執行緒就是在其中實際執行命令的流。
建立進程時,通常會啟動一個主線程,如果需要,也可以建立其他線程。
同一行程中的執行緒共享資源
屬於同一進程的執行緒共享程式碼、全域資料、堆和開啟的檔案。 相反,每個執行緒都有自己的堆疊、暫存器狀態和執行位置。
一個過程
┌──────────────────────────┐
│ 代碼/資料/堆共享 │
├────────────┬─────────────┤
│ Thread A │ Thread B │
│ Stack A │ Stack B │
│ Register A │ Register B │
└────────────┴─────────────┘
兩個執行緒可以使用同一個物件的位址的原因是因為它們共享堆。 另一方面,函數的局部變數基本上是在每個執行緒的堆疊上創建的,因此它們是相互分離的。
為什麼要使用線程?
例如,在遊戲中,工作執行緒可以執行路徑導航或資源加載,而主執行緒處理輸入和螢幕更新。 如果您有多個 CPU 核心,則不同的執行緒實際上可能會同時執行。
std::thread worker([]()
{
LoadResources();
});
UpdateGame();
worker.join();
join()導致當前線程等待,直到工作線程完成。
行程和執行緒之間的區別
進程在記憶體中基本上是隔離的,一個進程的問題很難直接波及到其他進程。 但發電和通訊成本較大。
由於線程共享相同的內存,因此很容易交換數據並且相對輕量級。 相反,不正確的指標存取或同步錯誤可能會破壞整個相同進程。
進程:資源所有權和隔離的單位
執行緒:CPU執行流程的單位
擁有更多線程並不一定會使事情變得更快。 如果劃分任務、等待鎖、快取衝突和上下文切換的成本超過了計算收益,它實際上會減慢速度。