C++ 11併發介紹

注:本文內容摘自:《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線程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章