注:本文內容摘自:《C++併發編程實戰》——Anthony Williams著 周全等譯
自己將其中的精華內容摘抄出來,做以筆記,加深印象與理解!
1.1何謂併發:
最簡單和最基本的併發,是指兩個或更多獨立的活動同時發生。
1.1.1 計算機系統中的併發:
計算機領域的併發指的是在單個系統裏同時執行多個獨立的任務,而非順序的進行一些活動。
1.1.2併發的表現:
單核處理器:通過任務調度(切換)實現僞併發
多核處理器:通過硬件支持達到真正的併發效果(單個芯片,內嵌多個處理器)
1.2 使用併發的原因:
1、關注點分離
2、提高性能
1.2.1利用併發提高性能的兩種方式:
1、任務並行(*taskparallelism*)or數據並行(*data parallelism*):
任務並行是將一個單個任務分成幾部分,且各自並行運行,從而降低總運行時間。
數據並行是每個線程在不同的數據部分上執行相同的操作;
2、使用可用的併發方式來解決更大的問題。
1.2.3 什麼時候不使用併發
收益<成本
成本:
1、 編寫、維護方面的腦力成本;
2、 複雜性可能會引來的更多的錯誤;
3、 性能增益可能會小於預期;
4、 線程佔用堆棧空間,所以運行太多的線程也會耗盡進程的可用內存或地址空間。對於一個可用地址空間爲4GB(32bit)的平坦架構的進程來說,如果每個線程都有一個1MB的堆棧(很多系統都會這樣分配),那麼4096個線程將會用盡所有地址空間,不會給代碼、靜態數據或者堆數據留有任何空間。
5、 運行越多的線程,操作系統就需要做越多的上下文切換,每個上下文切換都需要耗費本可以花在有價值工作上的時間。
1.3在c++中使用併發:
1.3.1 RAII(Resource Acquisition IsInitialization)-資源獲得即初始化:
許多C++類庫(如:MFC、Boost、ACE等c++通用類庫)共有的,同時也是爲程序員提供很大便利的特別重要的一種設計,用來確保退出相關作用域的時候互斥元被解鎖。
1.3.2 C++11新標準的變化:
1、對併發的支持;
2、編程語言自身的改善;
3、全面的原子操作庫;
4、更高級別的抽象和工具…
1.4一個簡單的C++併發例子:
#include"stdafx.h"
#include<iostream>
#include<thread>
void hello(){
std::cout<< "Hello World";
}
int main()//原始線程
{
std::threadt(hello);//新的線程t,並制定該線程的入口函數爲hello
t.join();
return 0;
}
幾點解釋:
1、<thread>:用於管理線程的函數和類的頭文件
2、main()函數:整個應用程序的入口函數,也是初始線程(調用線程:main線程在代碼中調用新線程,如調用std::thread t(hello););
3、std::thread t(hello):main函數中新創建的線程;
4、hello()函數:每一個線程必須有一個初始函數,該初始函數即使t線程的初始函數
5、t.jion():這個語句的執行將會導致調用線程(在main()函數中)等待與std::thread對象相關聯的線程,即該例子中的t線程。