併發、並行與多線程——C++

C++11標準在標準庫中爲多線程提供了組件。ios

併發:編程

併發指的是兩個或多個獨立的活動在同一時內發生。同一時間段內能夠交替處理多個操做。一個CPU交替處理多個任務,存在競爭關係,在邏輯上表現爲一個時段內同時處理多個任務。promise

並行:安全

並行就是同時執行,計算機在同一時,在某個時間點上處理兩個或以上的操做。判斷一個程序是否並行執行,只須要看某個時刻上是否多兩個或以上的工做單位在運行。一個程序若是是單線程的,那麼它沒法並行地運行。利用多線程與多進程能夠使得計算機並行地處理程序(固然 ,前提是該計算機有多個處理核心)。在物理上表現爲一個時段內同時處理多個任務。多線程

併發重點指的是程序的設計結構,而並行指的是程序運行的狀態。併發編程,是一種將一個程序分解成小片斷獨立執行的程序設計方法。併發

併發的基本方式途徑

多線程多進程是併發的兩種途徑。ide

多進程併發

多個進程獨立地運行,它們之間經過進程間常規的通訊渠道傳遞訊息(信號,套接字,文件,管道等),這種進程間通訊不是設置複雜就是速度慢,這是由於爲了不一個進程去修改另外一個進程,操做系統在進程間提供了必定的保護措施,固然,這也使得編寫安全的併發代碼更容易。
運行多個進程也須要固定的開銷:進程的啓動時間,進程管理的資源消耗函數

多線程併發

在當個進程中運行多個線程也能夠併發。線程就像輕量級的進程,每一個線程相互獨立運行,但它們共享地址空間,全部線程訪問到的大部分數據如指針、對象引用或其餘數據能夠在線程之間進行傳遞,它們均可以訪問全局變量。線程之間一般共享內存,但這種共享一般難以創建且難以管理,缺乏線程間數據的保護。所以,在多線程編程中,咱們必須確保每一個線程鎖訪問到的數據是一致的。this

C++中的併發與多線程

C++標準並無提供對多進程併發的原生支持,因此C++的多進程併發要靠其餘API——這須要依賴相關平臺。
C++11 標準提供了一個新的線程庫,內容包括了管理線程、保護共享數據、線程間的同步操做、低級原子操做等各類類。標準極大地提升了程序的可移植性,之前的多線程依賴於具體的平臺,而如今有了統一的接口進行實現。atom

C++11 新標準中引入了幾個頭文件來支持多線程編程:

< thread > :包含std::thread類以及std::this_thread命名空間。管理線程的函數和類在其中聲明。

< atomic > :包含std::atomic和std::atomic_flag類,以及一套C風格的原子類型和與C兼容的原子操做的函數。

< mutex > :包含了與互斥量相關的類以及其餘類型和函數。

< future > :包含兩個Provider類(std::promise和std::package_task)和兩個Future類(std::future和std::shared_future)以及相關的類型和函數。

< condition_variable > :包含與條件變量相關的類,包括std::condition_variable和std::condition_variable_any。

開線程

單線程時:

1 # include<iostream>
2 using namespace std;
3 int main()
4 {
5     cout<<"hello world"<<endl;
6 }

在這裏,進行由一個線程組成,該線程的初始函數是main。咱們啓動第二個線程來打印hello world:

複製代碼
1 # include<iostream>
 2 # include<thread>
 3 using namespace std;
 4 void hello()
 5 {
 6     cout<<"hello world"<<endl;
 7 }
 8 int main()
 9 {
10     thread t (hello);
11     t.join();
12 }
複製代碼

每一個線程都必須有一個初始函數,新線程的執行開始於初始函數。對於第一段程序來講,它的初始函數是main,對於咱們新建立的線程,能夠在std::thread()對象的構造函數中指定。在第二段程序裏,程序由兩個線程組成:初始線程始於main,新線程始於hello。這裏將新線程t的初始函數指定爲hello。

新線程啓動以後會與初始進程一併運行,初始線程能夠等待或不等待新進程的運行結束——若是須要等待線程,則新線程實例須要使用join(),不然能夠使用detach()。若是不等待新線程,則初始線程自顧自地運行到main()結束。

相關文章
相關標籤/搜索