之前學過一點c語言多執行緒方面的內容(pthread.h
),但是僅僅是會用,對多執行緒的實現原理什麼的基本上算是不了解。接下來,我的網路程式設計學習要進一步對**進行優化,其中肯定少不了對多執行緒的運用,所以在進行下一步之前,先系統的學習一下多執行緒。
本篇學習記錄使用的語言為c++,呼叫的執行緒庫為c++11裡的std::thread
庫。
零、基本概念
一、基本執行緒建立 `thread`
二、等待/分離 `join/detach`
三、鎖 `lock/unlock`
四、原子操作 `atomic`
乙個程序可以有多個執行緒,而乙個執行緒只能屬於乙個程序。
單核cpu的多執行緒執行為每條執行緒**執行一段時間後進行切換,實際還是為同時進行一條執行緒,因為切換的速度很快,給人一種同時進行的錯覺;而多核cpu的多執行緒執行為同時進行多條執行緒,當執行緒數量大於核數量時,也會進行執行緒的切換,保證執行緒的進行。
多執行緒的執行是搶占式的,即多條執行緒下,沒有執行順序的規律,
如下所示,新建乙個thread物件,建構函式傳參第乙個為執行緒執行函式,隨後為執行函式的傳參。
#include
using
namespace std;
thread *t1 =
newthread
(work,
1111);
void
work
(int a)
}
如下所示,新建乙個thread陣列,建構函式傳參第乙個為執行緒執行函式,隨後為執行函式的傳參。
#include
using
namespace std;
thread *t[4]
;for
(int n=
0;n<
4;n++
)void
work
(int a)
}
join是在main函式中等待執行緒執行完才繼續執行main函式,detach則是把該執行緒分離出來,不管這個執行緒執行得怎樣,往下繼續執行main函式。
#include
using
namespace std;
thread *t[4]
;for
(int n=
0;n<
4;n++
)
由於執行緒的執行是搶占式的,且變數資源等是共享的,對於多條執行緒同時執行的情況下,可能對同一段內容同時執行,其中涉及到的變數操作等就會產生錯誤。類似同時對乙個變數進行運算操作,由於賦值前的值不同,結果也就不同,導致資料出現問題。此時就可以使用鎖的操作防止此類錯誤發生。
#include
//鎖的標頭檔案
#include
using
namespace std;
mutex m;
//鎖的變數
void
work
(int a)
}
但是不停的上鎖和解鎖很容易忘記解鎖,就會出現該段**無法被執行,導致程式出現問題,且不會報錯。為了避免這種情況,我們可以使用自解鎖。自解鎖會自動對所處區間的**進行上鎖和解鎖操作,從而防止忘解鎖的情況發生。
#include
//鎖的標頭檔案
#include
using
namespace std;
mutex m;
//鎖的變數
void
work
(int a)
}
頻繁的上鎖解鎖操作會非常耗時,如果上鎖區域執行的**很少的話會非常不划算。如果我們在多執行緒中需要對變數操作的話,頻繁的給變數操作區域上下鎖價效比很低,此時我們可以使用原子變數。
#include
#include
#include
//原子操作
using
namespace std;
atomic_int count(0
);//原子變數
void
work
(int a)
}int
main()
for(
int n=
0;n<
2;n++
)while(1
)return0;
}
簡單 工作記錄 多執行緒相關
最近遇到多執行緒的問題,原來使用非同步請求多個介面 n 3次請求 方案一 使用多執行緒一次返回資料,最開始是使用5個執行緒,乙個執行緒順序請求3個介面,超時終止返回 缺點 測試發現必須3個介面全部成功才能取到資料,遇到部分介面失敗資料拿不到 方案二 使用6個執行緒,2個執行緒請求同乙個介面,每個執行...
C 多執行緒學習 一 多執行緒的相關概念
什麼是程序?當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。什麼是執行緒?執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式。什麼是多執行緒...
C 多執行緒學習 一 多執行緒的相關概念
什麼是程序?當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。什麼是執行緒?執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式。什麼是多執行緒...