詳細簡單的win中P,V操作(司機 售票員)C語言

2021-10-06 12:25:48 字數 2857 閱讀 9006

如果還不知道建立子程序,參考:

win中建立程序

正文開始:

c語言windows環境下::

建立訊號量

handle createsemaphore

( lpsecurity_attributes lpsemaphoreattributes,

// 安全屬性指標

long linitialcount,

// 初始計數

long lmaximumcount,

// 最大計數

lpctstr lpname // 物件名指標);

引數lmaximumcount是乙個有符號32位值,定義了允許的最大資源計數,最大取值不能超過4294967295。

lpname引數可以為建立的訊號量定義乙個名字,由於其建立的是乙個核心物件,因此在其他程序中可以通過該名字而得到此訊號量,這個名字非常重要,你在其他程序中可以直接通過這個名字找到這個訊號量。

開啟訊號量

handle opensemaphore

( dword dwdesiredaccess,

// 訪問標誌

bool binherithandle,

// 繼承標誌

lpctstr lpname // 訊號量名!!!!!!!!!);

這裡就是在其他程序中通過訊號量名字進行索引!!!!

釋放訊號量

bool releasesemaphore

( handle hsemaphore,

// 訊號量控制代碼

long lreleasecount,

// 計數遞增數量

lplong lppreviouscount // 先前計數

);

等待訊號量(相當於p操)

waitforsingleobject()//等乙個

waitformultipleobjects()//等多個

主要用在試圖進入共享資源的執行緒函式入口處,主要用來判斷訊號量的當前可用資源計數是否允許本執行緒的進入。

注意:實際上的p操作是在程序得到這個訊號量的時候就完成的,並不是上面兩個相當於p操作的函式完成的。p操作:waitforsingleobject(訊號量引用,等待時間)

v操作:releasesemaphore(訊號量引用,加的值,原始值)

例如現在有乙個s1訊號量:

waitforsingleobject

(s1,infinite)

;//等待無限時長

releasesemaphore

(s1,1,null);

//第三個引數原始值不用管

1.在司機程序中建立售票員程序,然後通過pv操作進行通訊

2.訊號量在哪定義呢?在司機裡面,並且定義的時候盡量取個名字,這樣在售票員子程序中可以直接通過名字獲取。

code:

//司機程序** 

#include

#include

handle s1 =

createsemaphore

(null,0

,1,"driver_s");

//司機的訊號

handle s2 =

createsemaphore

(null,0

,1,"conductor_s");

//乘務員的訊號

//!!!!!!!!!!!!!!你看,這裡取了名字,在其他程序中可以直接用opensemaphore()來對名字進行索引!!!

intmain()

;//記錄結構體有多大,必須要引數

process_information pi;

//程序id,程序控制代碼,執行緒id,執行緒控制代碼存在於這個結構體

bool flag =

createprocess

(null

,lppath,

null

,null

,false,0,

null

,null

,&si,

&pi)

;while

(!flag)

flag =

createprocess

(null

,lppath,

null

,null

,false,0,

null

,null

,&si,

&pi)

;//防止乘務員程序建立失敗

//司機程序

while

(true)

}

//乘務員程序** 

#include

#include

handle s1 =

opensemaphore

(semaphore_all_access, false,

"driver_s");

//使用opensemaphore函式獲得司機訊號量

handle s2 =

opensemaphore

(semaphore_all_access, false,

"conductor_s");

//獲取乘務員訊號量

//你看,在這裡就是通過訊號量的名字獲取的索引!!!!!!!

intmain()

return0;

}

執行結果:

作業系統中的PV操作

pv操作由p操作原語和v操作原語組成 原語是不可中斷的過程 對訊號量進行操作,具體定義如下 p s 將訊號量s的值減1,即s s 1 如果s 0,則該程序繼續執行 否則該程序置為等待狀態,排入等待佇列。v s 將訊號量s的值加1,即s s 1 如果s 0,則該程序繼續執行 否則釋放佇列中第乙個等待訊...

學 生活中的PV操作

之前寫過作業系統的文章,然後最近發現少了點什麼,仔細檢查發現,沒寫pv操作,那麼我們接下來就單獨為pv操作寫一篇部落格,讓大家不再懼怕pv操作,我們深入淺出的分析,讓大家輕鬆學習pv操作。學習pv操作之前,我們首先來了解兩個很基礎的概念 同步 互斥 同步 其實說同步還不如說 協作 就是我們的目標只有...

訊號量中的PV操作

一 訊號量的概念 1 訊號量的型別定義 訊號量 semaphore 的資料結構為乙個值和乙個指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量 當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由pv操作來改...