Linux程序通訊[2]-互斥鎖和條件變數
概述
上一篇介紹了共享記憶體,已經屬於比較高階的層次。本篇介紹一下多執行緒/多程序最基礎的問題,同步。
為了允許線上程或程序間共享資料,同步常常是必需的,也就是我們常說要用鎖(當然鎖通常也是效能瓶頸,現在無鎖架構正在越發流行)。互斥鎖和條件變數則是同步的基本組成部分。互斥鎖和條件變數在同一程序下的所有執行緒內是共享的,所有它天然可以用於執行緒同步。如果將互斥鎖和條件變數存放在多個程序的共享區內,則同樣可以用於程序間同步。(Posix標準)
互斥鎖
互斥鎖用於保護臨界區(critical section),保證在任何時刻只有一個執行緒/程序在執行其中的程式碼。保護一個臨界區的程式碼通常輪廓如下:
1 |
lock_the_mutex(...); |
2 |
//do
anything one by one |
3 |
unlock_the_mutex(...); |
在實際程式碼中,我們通常使用如下的資料機構和函式。
01 |
#include
<pthread.h> |
02 |
//pthread_mutex_t
是鎖的定義 |
03 |
static pthread_mutex_t
lock = PTHREAD_MUTEX_INITIALIZE; |
04 |
05 |
//嘗試對ptr上鎖,否則一直阻塞 |
06 |
int pthread_mutex_lock(pthread_mutex_t
*ptr); |
07 |
//嘗試對ptr上鎖,失敗則直接返回 |
08 |
int pthread_mutex_trylock(pthread_mutex_t
*ptr); |
09 |
//解鎖 |
10 |
int pthread_mutex_unlock(pthread_mutex_t
*ptr); |
條件變數
條件變數(condition)不同於互斥鎖,它主要用於等待。因為我們線上程/程序同步時,通常都需要等待其他執行緒/程序完成任務再繼續自己的任務。這時,僅僅使用mutex就無法完美的解決這個問題。假設我們只使用mutex,則需要鎖上一個mutex然後查詢,如果沒有前序任務則解鎖,然後隔斷時間再繼續上述過程。而藉助條件變數,我們則可以大大簡化這個過程。在鎖上mutex後,如果沒有前序任務則呼叫wait函式,系統會自動釋放mutex並且等待前置訊號的到達,且訊號到達後還是擁有mutex。
下面是condition的常用函式:
1 |
#include
<pthread.h> |
2 |
|