併發和競態(理論篇)

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. 讀取者/寫入者自旋鎖

類似於讀取者/寫入者信號量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章