概念:多個執行緒同時對臨界資源進行訪問,不會造成資料二義問題
實現:同步+互斥
同步:對臨界資源訪問的時序合理性
互斥:對臨界資源同一時間訪問的唯一性
執行緒間互斥的實現:互斥鎖mutex
pthread_mutex_t mutex; //定義互斥鎖變數
pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr); //對互斥鎖變數進行初始化
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex); //加鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex); //解鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex); //銷毀
死鎖:多個執行緒對資源進行競爭訪問,但因推進順序不當,導致相互等待,程式無法往下執行
死鎖產生的必要條件
1.互斥條件:乙個鎖只有乙個執行緒可以獲取
2.不可剝奪條件:a加的鎖,b不能解
3.請求與保持條件:a請求b,但獲取不到,a也不釋放已獲得的資源
4.環路等待條件:a請求b,同時b請求a
避免死鎖
1.破壞四個必要條件
2.加鎖順序一致
3.避免鎖未釋放的場景
4.資源一次性分配
實現:等待+喚醒
操作條件不滿足則等待,條件滿足則喚醒
條件變數
條件變數實現同步:執行緒在對臨界資源訪問之前,先判斷是否能夠進行操作,若可以則直接操作,若不能,則條件變數提供等待功能,其他執行緒促使操作條件滿足,然後喚醒條件變數等待佇列上的執行緒
pthread_cond_t cond; //定義條件變數
int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr); //條件變數初始化
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex); //使用者在判斷條件不滿足的情況下提供等待功能
int pthread_cond_signal(pthread_cond_t *cond); //使用者在促使條件滿足後,喚醒等待佇列上的執行緒
int pthread_cond_destroy(pthread_cond_t *cond); ///銷毀
乙個場景、兩種角色、三種關係
解決問題:解耦和、支援忙閒不均、支援併發
生產者與生產者之間應保持互斥關係
消費者與消費者之間應保持互斥關係
生產者與消費者之間應保持同步+互斥關係
//基於blockingqueue的生產者消費者模型
class blockqueue
;
posix訊號量
功能:實現執行緒間同步與互斥
本質:計數器(資源技術–判斷當前是否能對臨界資源進行操作)+等待佇列+等待+喚醒
原理:互斥原理:當只具有0/1計數時,就可實現互斥
初始計數為1,表示當前只有乙個執行緒能夠獲取資源,獲取資源之後計數-1,臨界資源操作完畢之後計數+1,並喚醒等待佇列上的執行緒;計數為0,其他執行緒進行等待
同步原理:
1.對程式邏輯進行控制(對臨界資源合理操作控制)
2.通過計數判斷當前是否能夠對臨界資源進行操作,不能操作(計數<=0),則等待
3.其他執行緒促使條件滿足後,計數+1,喚醒等待佇列上的執行緒
與條件變數的區別:
1.訊號量不需要搭配互斥鎖使用
2.訊號量本身的計數就是對臨界資源進行判斷,條件變數需要外部使用者判斷
sem_t sem; //定義訊號量
int sem_init(sem_t *sem, int pshared, unsigned int value); //訊號量初始化
int sem_wait(sem_t *sem); //判斷計數是否可以對臨界資源進行操作
int sem_post(sem_t *sem); //喚醒等待佇列上的執行緒
int sem_destroy(sem_t *sem); //銷毀
使用訊號量實現生產者與消費者模型
//基於喚醒佇列實現
class ringqueue
;
至少乙個執行緒+任務佇列(用於併發處理任務請求)
在程式初始化時,建立固定數量的執行緒(最大數量限制),從任務佇列中獲取任務,進行處理
作用:1.避免為大量請求建立執行緒,導致瞬間資源耗盡,程式崩潰的問題
2.避免大量執行緒頻繁建立銷毀所帶來的時間成本
實現:執行緒建立+執行緒安全的任務佇列
功能:1.執行緒池退出(執行緒池銷毀條件是在所有執行緒退出之後進行銷毀)
2.任務的安全入隊
3.任務處理
Linux 執行緒安全
多個執行緒同時訪問臨界資源,產生二義性。如何保證互斥鎖的原子訪問 互斥鎖使用過程 1.定義互斥鎖變數 pthread mutex t mutex1 2.初始化互斥鎖 int pthread mutex init pthread mutex t restrict mutex,const pthread...
Linux 執行緒安全
執行緒安全的實現 同步的實現 條件變數實現 條件變數 實現同步的思路向使用者提供兩個介面 乙個是負責讓執行緒陷入阻塞休眠的介面,乙個是負責喚醒執行緒 pcb等待佇列實質 通過條件判斷,什麼時候能夠使執行緒訪問臨界資源,若不能訪問就使得執行緒阻塞,若能夠訪問,就喚醒執行緒,實現執行緒對臨界資源訪問的合...
Linux 多執行緒執行緒安全
include include include include include include void fun void arg pthread exit null int main pthread join id,null exit 0 多執行緒 可以建立多少個執行緒 檢視所有後台大小限制 ul...