pv原語通過操作訊號量來處理程序間的同步與互斥的問題。其核心就是一段不可分割不可中斷的程式。
訊號量的概念2023年由著名的荷蘭計算機科學家dijkstra提出,其基本思路是用一種新的變數型別(semaphore)來記錄當前可用資源的數量。有兩種實現方式:1)semaphore的取值必須大於或等於0。0表示當前已沒有空閒資源,而正數表示當前空閒資源的數量;2) semaphore的取值可正可負,負數的絕對值表示正在等待進入臨界區的程序個數。
訊號量是由作業系統來維護的,使用者程序只能通過初始化和兩個標準原語(p、v原語)來訪問。初始化可指定乙個非負整數,即空閒資源總數。
pv操作由p操作原語和v操作原語組成(原語也叫原子操作atomic operation,是不可中斷的過程),對訊號量(注意不要和windows中的訊號量機制相混淆)進行操作,具體定義如下:
pv操作對於每乙個程序來說,都只能進行一次,而且必須成對使用。在pv原語執行期間不允許有中斷的發生。
p(s):
①將訊號量s的值減1,即s=s-1;
②如果s>=0,則該程序繼續執行;否則該程序被阻塞後進入與該訊號相對應的佇列中,然後轉程序排程。
v(s):
①將訊號量s的值加1,即s=s+1;
②該程序繼續執行;如果該訊號的等待佇列中有等待程序就喚醒一等待程序。
具體pv原語對訊號量的操作可以分為三種情況:
把訊號量視為乙個加鎖標誌位,實現對乙個共享變數的互斥訪問。實現過程如下:
p(mutex); // mutex的初始值為1 訪問該共享資料;
v(mutex);
非臨界區
把訊號量視為是某種型別的共享資源的剩餘個數,實現對一類共享資源的訪問。實現過程如下:
p(resource); // resource的初始值為該資源的個數n 使用該資源;
v(resource);
非臨界區
把訊號量作為程序間的同步工具(???)。實現過程如下:
臨界區c1;
p(s);
v(s);
臨界區c2;
(一) 題目
桌上有一空盤,允許存放乙隻水果。爸爸可向盤中放蘋果,也可向盤中放橘子,兒子專等吃盤中的橘子,女兒專等吃盤中的蘋果。規定當盤空時一次只能放乙隻水果供吃者取用,請用p、v原語實現爸爸、兒子、女兒三個併發程序的同步。
(二) 過程分析
2.兒子
p(orange)
取橘子v(emptydish)
(三) **實現
#include #includeusing namespace std;
dword winapi fatherthread(lpvoid); //爸爸往盤子中放橘子或蘋果的執行緒
dword winapi daughterthread(lpvoid); //女兒取走蘋果執行緒
dword winapi sonthread(lpvoid); //兒子取走橘子執行緒
int main()
return 0;
}dword winapi fatherthread(lpvoid)
else
}return 0;
}dword winapi daughterthread(lpvoid)
return 0;
}dword winapi sonthread(lpvoid)
return 0;
}
執行結果如下所示:
多執行緒PV
1 include 2 include 3 include stdafx.h 4 include beginthread endthread 5 include baseoperation.h 6 define n 10 78 typedef int semaphore 訊號量是一種特殊的整型變數 ...
PV 執行緒同步和多執行緒問題
基於訊號量的執行緒同步問題,主要用到p和v操作 訊號量s是具有非負整數值的全域性變數,它只能由兩類特殊的操作來處理。這兩種操作分別稱為p和v p s 如果當s是非0的,那麼p將s 1,並且立即返回。如果開始s就是0,那麼就掛起這個執行緒等待。v s 將s加1,如果有執行緒阻塞在p操作等待s變為非0,...
Windows多執行緒程式設計
一 問題的提出 編寫乙個耗時的單執行緒程式 新建乙個基於對話方塊的應用程式singlethread,在主對話方塊idd singlethread dialog新增乙個按鈕,id為idc sleep six second,標題為 延時6秒 新增按鈕的響應函式,如下 void csinglethread...