1. 程式人生 > >Linux 多線程同步機制:互斥量、信號量、條件變量

Linux 多線程同步機制:互斥量、信號量、條件變量

linux 信號量 條件變量

互斥量:互斥量提供對共享資源的保護訪問,它的兩種狀態:lock和unlock,用來保證某段時間內只有一個線程使用共享資源,互斥量的數據類型是pthread_mutex_t
主要涉及函數:pthread_mutex_lock() pthread_mutex_trylock() pthread_mutex_unlock()
Pthreaf_mutex_init() pthread_mutex_destroy()
lock與unlock之間所鎖定的區域為臨界區域(如果只加鎖不解鎖程序會阻塞等待)
信號量:信號量是一個特殊的整數值,主要用來控制多個線程(進程)對臨界資源的互斥訪問,線程根據信號量來判斷是否有訪問的資源,信號量是一種線程同步機制,信號量與信號不同。
信號量是一個計數器,可用於同步多線程對共享數據對象得訪問,為了獲得共享資源,線程需要執行以下操作:
1、測試控制該資源的信號量
2、若此信號量的值為正,則線程可以使用該資源,線程將信號量值減1,表示它使用了一個資源單位
3、若此信號量的值為0,則線程進入睡眠狀態,直至信號量值大於0。當線程被喚醒後,它返回至第1步。
條件變量: 只用互斥量很可能會引起死鎖,為此引入了條件變量,條件變量允許線程阻塞和等待另一個線程發送的信號,使用條件變量可以以原子方式阻塞線程,直到滿足某個條件為止,可以避免忙等。
條件變量常和互斥鎖一起使用,互斥量主要用來保證對臨界區的互斥進入,而條件變量則用於線程的阻塞等待,互斥鎖定進入臨界區以後,若條件不滿足,線程便轉為等待狀態,等待條件滿足後被喚醒執行,否則繼續執行,執行完後開鎖
條件變量的數據類型是pthread_cond_t
主要涉及函數:pthread_cond_init() pthread_cond_signal() pthread_cond_wait()
Pthread_cond_timewait() pthread_cond_broadcast()
Pthread_cond_wait()函數作用:
1.先對傳入的互斥量mutex解鎖(自動釋放即解鎖)
2.再wait阻塞等待(阻塞被別的線程的pthread_cond_singal()喚醒後必須先加鎖再執行)

讀寫鎖rwlock:
分為:rdlock(讀鎖):只要沒有線程持有某個給定的讀寫鎖用於寫,那麽任意數目的線程可以持有該讀寫鎖用於讀,共享鎖

wrlock(寫鎖):僅當沒有線程持有某個給定的讀寫鎖用於讀或者寫時,才能分配該讀寫鎖用於寫,獨占鎖
pthread_rwlock_t rwlock=PTHREAD_RWLOCK_INITIALIZER;(初始化讀寫鎖)
pthread_rwlock_rdlock(&rwlock):分配讀鎖
pthread_rwlock_wrlock(&rwlock):分配寫鎖
pthread_rwlock_unlock(&rwlock):解鎖(只有解讀寫鎖)

寫鎖解鎖後多個線程在同等條件下分配讀鎖和寫鎖時先分配寫鎖(優先考慮分配寫鎖,但這不是必須的(系統不同))

Linux 多線程同步機制:互斥量、信號量、條件變量