執行緒安全的實現
同步的實現
條件變數實現
條件變數:實現同步的思路向使用者提供兩個介面(乙個是負責讓執行緒陷入阻塞休眠的介面,乙個是負責喚醒執行緒)+ 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...