執行緒很像輕量級的程序,但是乙個程序中的所有執行緒都共享相同的位址空間,執行緒間的大部分資料都可以共享。執行緒間的通訊一般都通過共享記憶體來實現。
優點:缺點:
主要原因有兩個:任務拆分和提高效能。
在編寫軟體的時候,將相關的**放在一起,將無關的**分開,這是乙個好主意,這樣能夠讓程式更加容易理解和測試。將程式劃分成不同的任務,每個執行緒執行乙個任務或者多個任務,可以將整個程式的邏輯變得更加簡單。
在兩種情況下,併發能夠提高效能。
任務並行(task parallelism):將乙個單個任務分成若干個部分各自並行執行,從而降低執行時間。雖然聽起來很簡單,但其實是乙個相當複雜的過程,設想假如各個部分之間存在很多以來,乙個部分的執行需要使用到另乙個任務的執行結果,這個時候並不能很好的並行完成。
資料並行(data parallelism):每個執行緒在不同的資料部分上執行相同的操作。
c++98
標準中並沒有執行緒庫的存在,而在c++11
中終於提供了多執行緒的標準庫,提供了管理執行緒、保護共享資料、執行緒間同步操作、原子操作等類。
多執行緒庫對應的標頭檔案是#include
,類名為std::thread
。
#include #include void function_1()
int main()
這是乙個典型的單執行緒的單程序程式,任何程式都是乙個程序,main()
函式就是其中的主線程,單個執行緒都是順序執行。
將上面的程式改造成多執行緒程式其實很簡單,讓function_1()
函式在另外的執行緒中執行:
#include #include void function_1()
int main()
分析:
首先,構建乙個std::thread
物件t1
,構造的時候傳遞了乙個引數,這個引數是乙個函式,這個函式就是這個執行緒的入口函式,函式執行完了,整個執行緒也就執行完了。
執行緒建立成功後,就會立即啟動,並沒有乙個類似start
的函式來顯式的啟動執行緒。
一旦執行緒開始執行, 就需要顯式的決定是要等待它完成(join),或者分離它讓它自行執行(detach)。注意:只需要在std::thread
物件被銷毀之前做出這個決定。這個例子中,物件t1
是棧上變數,在main
函式執行結束後就會被銷毀,所以需要在main
函式結束之前做決定。
這個例子中選擇了使用t1.join()
,主線程會一直阻塞著,直到子執行緒完成,join()
函式的另乙個任務是**該執行緒中使用的資源。
執行緒物件和物件內部管理的執行緒的生命週期並不一樣,如果執行緒執行的快,可能內部的執行緒已經結束了,但是執行緒物件還活著,也有可能執行緒物件已經被析構了,內部的執行緒還在執行。
假設t1
執行緒是乙個執行的很慢的執行緒,主線程並不想等待子執行緒結束就想結束整個任務,直接刪掉t1.join()
是不行的,程式會被終止(析構t1
的時候會呼叫std::terminate
,程式會列印terminate called without an active exception
)。
#include #include void function_1()
void test()
int main()
// 使用 t1.detach()時
// test() finished
// i'm function_1()
// 使用 t1.join()時
// i'm function_1()
// test() finished
分析:
由於執行緒入口函式內部有個500ms
的延時,所以在還沒有列印的時候,test()
已經執行完成了,t1
已經被析構了,但是它負責的那個執行緒還是能夠執行,這就是detach()
的作用。
如果去掉main
函式中的1s
延時,會發現什麼都沒有列印,因為主線程執行的太快,整個程式已經結束了,那個後台執行緒被c++
執行時庫**了。
如果將t1.detach()
換成t1.join()
,test
函式會在t1
執行緒執行結束之後,才會執行結束。
一旦乙個執行緒被分離了,就不能夠再被join
了。如果非要呼叫,程式就會崩潰,可以使用joinable()
函式判斷乙個執行緒物件能否呼叫join()
。
void test()
C 11多執行緒程式設計
1 c 11新標準引入了五個標頭檔案支援多執行緒程式設計,分別如下 該標頭檔案 該標頭檔案主要宣告了std thread類,其中std this thread 提供了一些輔助函式 命名空間也在該標頭檔案中 該標頭檔案主要宣告了std atomic和std atomic flag兩個類,另外還宣告了一...
c 11 多執行緒程式設計 原子
以下是我關於c 11多執行緒程式設計的學習體會,希望大家多指正 目的 1 原子型別的引入意味著不需要額外的同步機制就可以執行併發的讀寫操作。2 原子操作的確可以作為解決共享資料引起的問題的一種有效的手段。示例 已在vs2015 編譯通過 test atomic 1.cpp 定義控制台應用程式的入口點...
C 11 多執行緒
新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...