Linux 執行緒安全

2021-10-03 02:57:33 字數 2071 閱讀 8301

執行緒安全的實現

同步的實現

條件變數實現

條件變數:實現同步的思路向使用者提供兩個介面(乙個是負責讓執行緒陷入阻塞休眠的介面,乙個是負責喚醒執行緒)+ pcb等待佇列實質

通過條件判斷,什麼時候能夠使執行緒訪問臨界資源,若不能訪問就使得執行緒阻塞,若能夠訪問,就喚醒執行緒,實現執行緒對臨界資源訪問的合理性。

消費者與生產者:

注意:條件變數只是提供了等待與喚醒的介面,本身並沒有具備條件判斷的功能,意味著:條件變數判斷是需要使用者自己完成

條件變數的介面功能

pthread_cond_init

(pthread_cond_t *cond,pthread_cond_condattr_t *attr)

cond = pthread_cond_initalizer

pthread_cond_timewait

(pthread_cont_t *cond,pthread_mutex_t *mutex,

struct timespec *abstime);

限制等待時長的阻塞條件:等待一段指定的時間,時間到了呼叫就報錯返回-etimeout

執行緒等待介面會將不能訪問臨界資源的執行緒加入到等待佇列中。條件變數搭配互斥鎖使用的,條件變數並不提供條件判斷的功能,需要使用者自己去判斷,(通常條件的判斷是乙個臨界資源的訪問),因此這個資源的訪問就需要受保護,所以需要配合護互斥鎖使用。

互斥的實現原理

同一時間只有乙個執行流能夠訪問臨界資源。

互斥實現的技術:互斥鎖

互斥鎖(mutex)

本質就是乙個計數器,只要0/1的計數器,用於標記資源當前的訪問狀態,1表示可訪問,0表示不可訪問。

加鎖

每個執行緒在訪問臨界資源之前都要先訪問互斥鎖。

互斥鎖原理

互斥鎖通過在訪問資源前加鎖,訪問結束後解鎖,從而實現互斥鎖計數的原子性。

互斥鎖本身就是乙個臨界資源

互斥鎖的操作流程

mutex = pthread_mutex_initalizer

intpthread_mutex_init

(pthread_mutex *mutex,pthread_mutexattr_t *attr)

mutex:互斥鎖變數首位址

attr:互斥鎖屬性,通常為null

int

pthread_mutex_lock

(pthread_mutex_t *mutex)

;阻塞加鎖,如果不能加鎖,則一直等待

intpthread_mutex_trylock

(pthread_mutex_t *mutex)

;非阻塞加鎖,如果不能加鎖,則報錯返回

int

pthread_mutex_unlock

(pthread_mutex_t *mutex)

;

int

pthread_mutex_destroy

(pthread_mutex_t mutex)

;

鎖的初始化一定要在建立執行緒之前。

加鎖後,在任意有可能退出的地方解鎖

鎖的銷毀,一定是保證沒有人使用互斥鎖的時候 死鎖

產生原因

多個執行流對鎖資源進行爭搶訪問,但是由於推進順序不當,從而導致互相等待,最後造成程式流程無法執行完成。

死鎖產生的必要條件

如何避免產生死鎖

Linux 執行緒安全

概念 多個執行緒同時對臨界資源進行訪問,不會造成資料二義問題 實現 同步 互斥 同步 對臨界資源訪問的時序合理性 互斥 對臨界資源同一時間訪問的唯一性 執行緒間互斥的實現 互斥鎖mutex pthread mutex t mutex 定義互斥鎖變數 pthread mutex init pthrea...

Linux 執行緒安全

多個執行緒同時訪問臨界資源,產生二義性。如何保證互斥鎖的原子訪問 互斥鎖使用過程 1.定義互斥鎖變數 pthread mutex t mutex1 2.初始化互斥鎖 int pthread mutex init pthread mutex t restrict mutex,const pthread...

Linux 多執行緒執行緒安全

include include include include include include void fun void arg pthread exit null int main pthread join id,null exit 0 多執行緒 可以建立多少個執行緒 檢視所有後台大小限制 ul...