《c++ concurrency in action》讀書筆記1

1. 什麼是併發
通俗來講,併發指兩個或者多個獨立的事件(活動)同時發生。好比,一邊走路一邊說話,兩個手同時作不一樣的事情。
計算機系統的併發是指一個系統並行處理多個獨立的事件(活動), 而不是按順序或者一個接一個的處理。 在單處理器單核系統中經過task switching的方式實現併發。在多處理器或者多核計算機中,能夠實現真正意義的併發,咱們將其稱爲硬件併發。在硬件併發的機器上,task switching也是常常發生的,這是由於併發的做業數,可能會多於硬件線程數。
下圖描述的是4個task在兩個core上運行的場景:c++

 


2. 併發的方式
多進程併發:即將應用分紅多個獨立的單線程的進程服務
api

缺點:通訊複雜耗時,操做系統開銷較大。安全

優勢:更容易寫出安全的併發代碼,能夠將進程分配到獨立的機器上,經過網路通訊。
多線程併發:
多線程

同一個進程中全部線程共享地址空間,(儘管也能夠在多進程間共享memory, 但創建複雜,且不易於管理,這是由於相同數據的內存地址,在不一樣進程中並不須要同樣)併發

優勢:系統開銷更小,通訊開銷小性能

缺點:須要解決多線程間數據一致性問題。測試

 

3. 爲何使用併發spa

使用併發主要是基於兩個緣由,separation of concerns 和性能。操作系統

separation of concerns: 將相關的代碼組織在一塊兒,將不相關的代碼分開,讓程序易於理解和測試,進而減小bug線程

 

4. 何時不使用併發

當併發帶來的好處不值得cost時,就不該該使用併發。由於使用併發的代碼更難以理解,編寫和維護,並且可能會有更多的bug。

須要注意的是:

a. 併發帶來的性能提高,可能沒有預期的那麼大,由於線程也會帶來許多額外的開銷(操做系統須要分配內核資源,棧空間,並增長新的線程到調度器中,這些都會增長時間)

b. 線程是有限的資源,當線程數量太可能是會致使整個系統運行變慢. 甚至,由於每一個線程有獨立的棧空間,大量的線程會耗盡可用的memory或者進程的地址空間, 特別對32位的進程來講,可用的地址空間爲4GB, 在許多系統中每一個線程有1M的棧空間, 4096個線程就會耗盡地址空間。

c. 線程越多,操做系統要作的上下文切換越多。

 

5. C++中的併發與多線程

C++11中,一個重要的feature就是對多線程的支持,不只包括全新的線程感知內存模型,還擴展了線程管理,共享數據保護,線程間的同步和原子操做。

C++11在多線程方面的性能,相對低層api,  c++庫額外的開銷是抽象帶來的開銷,但c++線程庫設計的一個目標即這種性能損耗不多或沒有。

對於一些平臺特有的特性,可以使用native_handle調用.


6. 例子 hello world

相關文章
相關標籤/搜索