Linux 執行緒安全

2021-09-26 19:57:34 字數 2636 閱讀 6101

概念:多個執行緒同時對臨界資源進行訪問,不會造成資料二義問題

實現:同步+互斥

同步:對臨界資源訪問的時序合理性

互斥:對臨界資源同一時間訪問的唯一性

執行緒間互斥的實現:互斥鎖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...