汕頭網(wǎng)站建設(shè)系統(tǒng)學(xué)校網(wǎng)站建設(shè)
C++11并發(fā)與多線程筆記(1)
- 1、并發(fā)、進(jìn)程、線程的基本概念和綜述
- 1.1 并發(fā)
- 1.2 可執(zhí)行程序
- 1.3 進(jìn)程
- 1.4 線程
- 1.5 學(xué)習(xí)心得
- 2、并發(fā)的實(shí)現(xiàn)方法
- 2.1 多進(jìn)程并發(fā)
- 2.2 多線程并發(fā)
- 3、C++11新標(biāo)準(zhǔn)線程庫
1、并發(fā)、進(jìn)程、線程的基本概念和綜述
1.1 并發(fā)
指在一個(gè)時(shí)間段內(nèi)有多個(gè)進(jìn)程在執(zhí)行
- 兩個(gè)或者更多的任務(wù)(獨(dú)立的活動(dòng))同時(shí)發(fā)生(進(jìn)行):一個(gè)程序同時(shí)執(zhí)行多個(gè)獨(dú)立的任務(wù);
- 以往計(jì)算機(jī),單核cpu(中央處理器):某一個(gè)時(shí)刻只能執(zhí)行一個(gè)任務(wù),由操作系統(tǒng)調(diào)度,每秒鐘進(jìn)行多次所謂的“任務(wù)切換”。并發(fā)的假象(不是真正的并發(fā)),切換(上下文切換)時(shí)要保存變量的狀態(tài)、執(zhí)行進(jìn)度等,存在時(shí)間開銷;
- 隨著硬件發(fā)展,出現(xiàn)了多處理器計(jì)算機(jī):用于服務(wù)器和高性能計(jì)算領(lǐng)域。臺(tái)式機(jī):在一塊芯片上有多核(一個(gè)CPU內(nèi)有多個(gè)運(yùn)算核心,對于操作系統(tǒng)來說,每個(gè)核心都是作為單獨(dú)的CPU對待的):雙核,4核,8核,10核(自己的筆記本是4核8線程的)。能夠?qū)崿F(xiàn)真正的并行執(zhí)行多個(gè)任務(wù)(硬件并發(fā));
- 使用并發(fā)的原因:主要就是同時(shí)可以干多個(gè)事,提高性能。
1.2 可執(zhí)行程序
磁盤上的一個(gè)文件,windows下,擴(kuò)展名為.exe;linux下,ls -la,rwx(可讀可寫可執(zhí)行)
1.3 進(jìn)程
計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ),一段程序的執(zhí)行過程。
- 運(yùn)行一個(gè)可執(zhí)行程序(在windows下,可雙擊;在linux下,./文件名), 進(jìn)程,一個(gè)可執(zhí)行程序運(yùn)行起來了,就叫創(chuàng)建了一個(gè)進(jìn)程。
進(jìn)程就是運(yùn)行起來的可執(zhí)行程序
1.4 線程
是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。
(1)
- 每個(gè)進(jìn)程(執(zhí)行起來的可執(zhí)行程序),都有唯一的一個(gè)主線程
- 當(dāng)執(zhí)行可執(zhí)行程序時(shí),產(chǎn)生一個(gè)進(jìn)程后,這個(gè)主線程就隨著這個(gè)進(jìn)程默默啟動(dòng)起來了
- ctrl+F5運(yùn)行這個(gè)程序的時(shí)候,實(shí)際上是進(jìn)程的主線程來執(zhí)行(調(diào)用)這個(gè)main函數(shù)中的代碼。線程:用來執(zhí)行代碼的。
線程這個(gè)東西,可以理解為一條代碼的執(zhí)行通路
(2)
- 除了主線程之外,可以通過寫代碼來創(chuàng)建其他線程,其他線程走的是別的道路,甚至去不同的地方
- 每創(chuàng)建一個(gè)新線程,就可以在同一時(shí)刻,多干一個(gè)不同的事(多走一條不同的代碼執(zhí)行路徑)
(3)多線程(并發(fā))
線程并不是越多越好,每個(gè)線程,都需要一個(gè)獨(dú)立的堆??臻g(大約1M),線程之間的切換要保存很多中間狀態(tài),切換也會(huì)耗費(fèi)本該屬于程序運(yùn)行的時(shí)間
必須使用多線程的案例
1.5 學(xué)習(xí)心得
- 開發(fā)多線程程序:一個(gè)是實(shí)力的體現(xiàn),一個(gè)是商用的必須需求
- 線程開發(fā)有一定難度
- C++線程會(huì)設(shè)計(jì)很多新概念
- 網(wǎng)絡(luò)方向:網(wǎng)絡(luò)通訊、網(wǎng)絡(luò)服務(wù)器,多線程是絕對繞不開的
2、并發(fā)的實(shí)現(xiàn)方法
實(shí)現(xiàn)并發(fā)的手段:
- 通過多個(gè)進(jìn)程實(shí)現(xiàn)并發(fā)
- 在單獨(dú)的進(jìn)程中,寫代碼創(chuàng)建除了主線程之外的其他線程來實(shí)現(xiàn)并發(fā)
2.1 多進(jìn)程并發(fā)
- 比如賬號(hào)服務(wù)器一個(gè)進(jìn)程,游戲服務(wù)器一個(gè)進(jìn)程。
- 服務(wù)器進(jìn)程之間存在通信(同一個(gè)電腦上:管道,文件,消息隊(duì)列,共享內(nèi)存);(不同電腦上:socket通信技術(shù))
2.2 多線程并發(fā)
- 線程:感覺像是輕量級(jí)的進(jìn)程。每個(gè)進(jìn)程有自己獨(dú)立的運(yùn)行路徑,但一個(gè)進(jìn)程中的所有線程共享地址空間(共享內(nèi)存),全局變量、全局內(nèi)存、全局引用都可以在線程之間傳遞,所以多線程開銷遠(yuǎn)遠(yuǎn)小于多進(jìn)程
- 多進(jìn)程并發(fā)和多線程并發(fā)可以混合使用,但建議優(yōu)先考慮多線程技術(shù)
- 本課程中只講多線程并發(fā)技術(shù) B站C++11并發(fā)與多線程
3、C++11新標(biāo)準(zhǔn)線程庫
以往
- windows:CreateThread(), _beginthread(),_beginthreadexe()創(chuàng)建線程;linux:pthread_create()創(chuàng)建線程;不能跨平臺(tái)
- 臨界區(qū),互斥量
- POSIX thread(pthread):跨平臺(tái),但要做一番配置,也不方便
C++11
- 從C++11新標(biāo)準(zhǔn),C++語言本身增加對多線程的支持,意味著可移植性(跨平臺(tái)),這大大減少開發(fā)人員的工作量