windows多執行緒(九) PV原語分析同步問題

2021-08-20 11:54:15 字數 1803 閱讀 4912

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...