1.c++併發概念及入門小例子

最近在學C++併發,做爲一個學習知識追求效率,對所學新概念又力求通俗易懂的我來講,該寫點東西來做筆記,以便之後的複習。 做爲一名新手,筆記中不免會有錯誤的地方,但願路過的大神有錯的話請指出錯誤,我會更正,謝謝。 進入正題。 首先學併發以前要了解什麼是併發?什麼是並行? 我我的的觀點是:併發強調的是單個CPU可以同時處理多個不一樣的事件的能力(這裏所謂的同時是在宏觀上的同時,但精確到某一時刻在微觀上CPU只執行多個任務中某個任務的一個小切片,而後不斷的經過上下文切換實現多任務的交替處理,從而在宏觀上讓人感受是同時可以處理多任務的感受),好比事件A,B,在1s的間隔之間它花0.5s完成執行A的一部分,接着切換一下任務,在接下來的0.5s執行B的一部分,而後在日後的每1s時間間隔內繼續重複執行A,B的部分代碼及任務的切換,若是沒有併發對於要處理的事件CPU只能一件一件的來處理,例如先完成A再完成B;而並行強調的是不一樣的事件分別經過多個CPU來同時處理,例如事件A,B,事件A在CPU1上執行,事件2在CPU2上執行,它們之間互不干擾,從而達到快速處理的目的。 乍看之下發現並行貌似要比並發好,那爲何還使用併發呢?一個運行中的程序就是一個進程,打開電腦查看一下,發現電腦的運行的進程數目要遠大於CPU的核心數,因此要完成各個任務處理器只能經過併發來執行啦。 從C++11開始,C++提供相應的庫來支持多線程的開發。 如同c語言要使用printf()函數來打印輸出同樣,首先要把頭文件包含進來。 要編寫多線程程序,在C++程序中就要包含相應的庫來建立線程。 寫程序以前聊聊線程,線程是在進程內構成單獨執行流的單位,進程內的每一個線程都有單獨的棧區域!全部的線程都共享數據區和堆區!!! 下面編寫第一個多線程hello world的例子。ios

建立文件名爲hello.cc的文件,輸入:c++

#include<iostream> 多線程

#include<thread> //用於管理線程的函數和類在這個庫中併發

using namespace std; void hello() { cout<<"Hello World!"<<endl; }函數

int main() { std::thread my_th1(hello);//線程建立時必須加入可調用類型做爲函數入口,這裏hello()函數做爲線程建立成功後執行的函數學習

my_th1.join();spa

return 0;操作系統

}線程

完成後使用:進程

g++ hello.cc -o hello -std=c++0x -pthread編譯時要加入-pthread的參數,這樣才能正確的編譯。

程序運行,輸出結果以下:

Hello World!

這裏有些要注意的地方:一個進程執行以後會有一個主線程,這裏是main主線程,要想建立其餘線程,就在main主線程中建立,這裏建立my_th1線程。 建立成功後,main主線程和my_th1線程在CPU上併發運行,它們共享數據區和堆。 join()的做用是,main主線程建立my_th1線程後,若是my_th1乾的活不少而主線程的活幹完了,它會等my_th1這個線程幹完活了才結束,而後通知操做系統回內存。 若是不join() my_th1線程的話,main主線程執行完了,這時它會本着死道友不死貧道的精神通知對操做系統回收內存,無論my_th1線程是否幹完活,操做系統都會回收內存,那些共享數據區和堆啊都會被回收,若是恰好my_th1線程的活沒幹完,my_th1線程會在一段被回收的內存上進行操做,程序會引起錯誤。

相關文章
相關標籤/搜索