一、信號量
信號量是操作系統提供的一種協調共享資源訪問的方法
信號量的實現:
爲什麼信號量的實現就不會被中途打斷呢,因爲信號量是由操作系統來實現的,保證了PV操作的原子性,這也是其主要的優勢。
classSemaphore{
int sem;
WaitQueue q;
}
Semaphore::P() {
sem--;
if(sem<0) {
Add this thread t to q;
block(p);
}
}
Semaphore::V() {
sem++;
if(sem<=0) {
Remove a thread t from q;
Wakeup(p);
}
}
二、信號量的使用
1.用信號量來實現臨界區的互斥訪問
注意:必須成對使用P()操作和V()操作
P()操作保證互斥訪問臨界區資源
V()操作在使用後釋放臨界區資源
PV操作不能次序顛倒、重複或者遺漏。
每類資源設置一個信號量,其初值爲1
mutex = new Semaphore(1);
mutex->P();
Critical Section;
mutex->V();
2.用信號量實現條件同步
3.生產者消費者問題
三、管程
管程是一種用於多線程互斥訪問共享資源的程序結構
管程與臨界區的區別主要在第三條,可臨時放棄。
管程可以有多個條件變量
管程與信號量的區別在於信號量初值爲資源數,管程爲0.
用管程解決生產者消費者問題:
可以吧PV操作集中到一個模塊中,更容易實現。
管程實現這個問題,把檢查資源區是否是空滿的狀態放在管程內部,也就是在進入資源區之前,用信號量來實現就先進入臨界區再判斷。