程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk C栗子吧(第一百回:C語言實例--使用信號量進行進程間同步與互斥一)

一起talk C栗子吧(第一百回:C語言實例--使用信號量進行進程間同步與互斥一)

編輯:關於C語言

一起talk C栗子吧(第一百回:C語言實例--使用信號量進行進程間同步與互斥一)



各位看官們,大家好,上一回中咱們說的是進程間同步與互斥的例子,這一回咱們說的例子是:使用信號量進行進程間同步與互斥。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

看官們,信號量是由著名計算機科學家迪傑斯特拉(Dijkstra)提出的一種概念,專門用來解決進程間同步與互斥。在他提出的概念中信號量是一個非負整數值.

信號量的操作只能有兩種原子操作

等待信號; 發送信號。

“什麼是原子操作呢?”台下有看官在提問,原子操作就是指某個動作在運行時不能被其它動作中斷,它會一直進行,直到該動作運行完成為止。比如,我們在寫代碼的時候,突然收到一封郵件,這時候系統會暫時中斷寫代碼的程序vim(我用的是vim),然後讓郵箱客戶端發一個收到郵件的通知,然後再恢復到vim寫代碼的動作中。例子中使用vim寫代碼的動作就不是一個原子操作,只有它不能被其它動作中斷時,它才是一個原子操作。接下來我們介紹對信號量的原子操作。

等待信號

等待信號也叫P操作。例P(sem)表示對信號量sem進行P操作。

如果sem的值大於零,p操作會把sem的值減去1; 如果sem的值等於零,那麼掛起執行p操作的進程;

發送信號

發送信號也叫V操作。例如V(sem)表示對信號量sem進行V操作。

如果有進程在因為等待sem而被掛起,那麼喚醒等待的進程;如果沒有進程因為等待sem而被掛起,那麼把sem的值加上1.

偽代碼

下面是使用信號量進行進程同步與互斥的偽代碼

nocritical code     //非臨界區的代碼
P(sem);             //執行P操作,進入臨界區,執行臨界區中的代碼
{
    critical code;  //臨界區代碼
    do something
}
V(sem);            //執行V操作,離開臨界區
nocritical code    //非臨界區的代碼

假設上面偽代碼中的信號量sem值為1,進程A開始執行上面的偽代碼,在進入臨界區前先對信號量進行P操作,這時sem的值變為0,然後進程A執行臨界區中的代碼,這個時候進程B也開始執行上面的偽代碼,在進入臨界區前先對信號量進行P操作,這時進程A還沒有離開臨界區,信號量sem的值為零,進程B就會被掛起,直到進程A離開臨界區執行V操作時,sem的值變為1,然後喚醒等待sem的進程B,接著進程B進入臨界區並且執行臨界區中的代碼。

大家可以看到,通過信號量的P/V操作,可以保證在同一個時間內,只有一個進程在執行臨界區中的代碼,也就是說實現了進程的同步與互斥。

看官們,本章回中就不寫代碼了,因為我們還沒有介如何使用信號量,在後面的章回中,我們會介紹信號量的操作,並且結合具體的例子,把偽代碼轉換成實際的代碼。

各位看官,關於使用信號量進行進程間同步與互斥的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved