建立執行緒
void
*fun()
//執行緒函式
thread t1
(fun)
;t1.
join()
;
join() 是兩個執行緒交匯的意思,工作執行緒和主線程在此處交匯,jion() 之後的主線程會阻塞直到工作執行緒執行結束。
detach() 使執行緒函式脫離執行緒物件,即當執行緒物件銷毀了執行緒函式依然可能執行。通常不推薦這麼做。
互斥鎖的使用
std::mutex;
std::lock_guard
//模板類,raii封裝,基於作用域
std::unique_lock
//模板類
mutex 需要手動加鎖、解鎖,如果中間丟擲異常可能會無法順利解鎖,造成死鎖
std::mutex mymutex;
void
*threadfunction()
於是有了raii封裝的lock_guard、unique_lock等模板類
std::mutex mymutex;
void
*threadfunction()
互斥鎖是對共享資源的獨佔,同一時刻只能有乙個執行緒占有該共享資源
條件變數
c++ 11中有std::condition_variable ,可以和互斥鎖一起使用,比如在生產者消費者問題中,當共有資源為空時,消費者執行緒應處於等待狀態,當生產者執行緒生產出來商品時,應該通知消費者執行緒將其喚醒。
int num=0;
//共享資源
std::mutex mymutex;
std::condition_variable mycv;
void
*consumer()
--num;}}
void
*producer()
}
訊號量
c++中目前沒有訊號量,作業系統中有提供訊號量的api
訊號量實現執行緒同步是通過訊號量的的資源數來實現的,互斥鎖其實可以看作是一種特殊的訊號量,互斥鎖可以看作是訊號量為1的特殊情況。
訊號量就像是現在有若干把鑰匙,只有當前還有剩餘的鑰匙,人才能進入房間,鑰匙的數量就是訊號量的值,執行緒就好比人,人進去房間就必須要獲得鑰匙,而執行緒要正常執行就必須獲得訊號量。
linux中常用的訊號量api如下:
#include
intsem_init
(sem_t* sem,
int pshared,
unsigned
int value)
;int
sem_destroy
(sem_t* sem)
;int
sem_post
(sem_t* sem)
;int
sem_wait
(sem_t* sem)
;int
sem_trywait
(sem_t* sem)
;int
sem_timedwait
(sem_t* sem,
const
struct timespec* abs_timeout)
;
訊號量的使用
//首先宣告訊號量
sem_t mysemaphore;
//訊號量初始化
//第乙個引數是要初始化的訊號量,第二個引數通常設為0,
//第三個引數是訊號量初始的值,
sem_init
(&mysemaphore,0,
0);
sem_post(&mysemaphore);,釋放訊號量的資源,訊號量的資源計數+1,如果訊號量由0變為1則處於等待狀態的執行緒將會被喚醒
sem_wait(&mysemaphore);
若訊號量的資源計數值為0,則該執行緒將處於阻塞狀態;
如果訊號量的資源計值大於0則該執行緒將會被喚醒,同時將計數值-1;
函式呼叫成功將會返回0
如果有多個執行緒處於等待中,同時執行緒資源數為1則只有乙個執行緒會被喚醒。
C 學習 多執行緒程式設計 多執行緒基礎
c 內建了對多執行緒程式設計的支援功能,所以相對於其他語言在多執行緒方面的問題,c 這裡就已經最小化或者不復存在。在.net framework 4.0中,c 中新增了兩個與多執行緒應用程式相關的重要功能 tpl 任務執行並行庫 和plinq 並行linq 兩者都提供對並行程式設計的支援,都可以利用...
待修改 C 多執行緒程式設計學習筆記
標頭檔案 include建立執行緒 void show int x void print string str,int i t1.join return 0 只要不將f洩露,就不會引起資源競爭。死鎖,與解決死鎖的辦法 先寫乙個出現死鎖的小例子 include include include incl...
C 多執行緒學習筆記
一 基本概念 bi d.z9k l b 0 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。q7 j ka ik z b0 執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 ...