C 多執行緒程式設計學習筆記

2021-10-06 01:34:54 字數 2206 閱讀 4132

建立執行緒

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 執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 ...