1. 信號量
信號量是爲了解決共享資源問題而生的,通過著名的P/V操作可以獲取和釋放信號量,只有獲得信號量的線程纔可以訪問共享資源,從而防止競態的發生。
其中P操作有三種情況:
void down(struct semaphore *sem); // 如果信號量可以獲得,信號量減一; 如果信號量不可以獲得則阻塞進程並不可中斷
int down_interruptible(struct semaphore *sem); // 如果信號量可以獲得,信號量減一,函數返回零; 如果信號量不可以獲得則阻塞進程但可以被中斷,如果進程被中斷,函數返回非零值
int down_trylock(struct semaphore *sem); // 如果信號量可以獲得,函數返回零; 如果信號不可以獲得,函數返回非零值
V操作只有一種情況:
void up(struct semaphore *sem); // 任何拿到信號量的線程都必須通過調用一次且僅有一次up函數來釋放信號量
2. 讀取者/寫入者信號量
當共享資源可以被且僅被一個寫入者訪問,或者當共享資源可以被一個或多個讀寫者訪問時,可以考慮使用這種特殊的信號量。
3. completion
當需要解決共享資源的同步訪問問題時,可以考慮使用completion。
4. 自旋鎖
"一個自旋鎖是一個互斥設備,它只能有兩個值:“鎖定”和“解鎖”"(LDD3 p119)
在不能阻塞代碼中可以考慮使用自旋鎖解決資源共享的問題。
5. 讀取者/寫入者自旋鎖
類似於讀取者/寫入者信號量