利用記錄型信號量機制: wait(s), signal(s)解決進程同步問題


wait(s) 等價與P操作, signal(s)等價於V操作

生產者-消費者問題

int in = 0, out = 0;
item buffer[n];
semaphore mutex = 1, empty = n, full = 0;
void procuder() {
  do {
      procuder an item nextp;
      ...
      wait(empty);//表示空緩沖區-1;
      wait(mutex);//數據緩沖區互斥訪問,關閉訪問;
      buffer[in] = nextp;
      in = (in+1) % n;
      signal(mutex);//打開訪問
      signal(full);//滿緩沖區加+1
  } while (true);
}

void consumer() {
   do {
       wait(full);//判斷是否有滿緩沖區,滿緩沖區-1
       wait(mutex);
       nextc = buffer[out];
       out = (out+1) % n;
       signal(mutex);
       siganl(empty);//空緩沖區+1
       consumer the item in nextc;
       ....
   } while (true);
}

void main() {
  cobegin
    producer(); consumer();
  coend
}

爸爸媽媽洗水果,兒子女兒吃水果問題

問題描述:爸爸專向盤中放蘋果,媽媽專向盤中放橘子,兒子專等吃盤里的橘子,女兒專等吃盤里的蘋果。只要盤子空,爸爸媽媽可向盤中放水果,僅當盤中有自己需要的水果時,兒子或女兒可從中取出,請給出他們四人之間的同步關系,並用PV操作實現四人正確活動的程序。。使用p、v操作來完成父親、媽媽、兒子、女兒的同步行為模擬。

semaphore putmutex = 1, getmutex = 0;
semaphore empty = 1, apple = 0, orange = 0;
void father() {
  do {
    wait(putmutex);
    apple++;
    empty--;
    signal(putmutex);
  } while (true);
}
void mother() {
  do {
    wait(putmutex);
    orange++;
    empty--;
    signal(putmutex);
  } while (true);
}
void son() {
   do {
     wait(getmutex);
     orange--;
     empty++;
     signal(getmutex);
   } while (true);
}
void daughter() {
  do {
    wait(getmutex);
    apple--;
    empty++;
    signal(getmutex);
  } while (true);
}
void main() {
  cobegin
    father(); mother(); son(); daughter();
  coend
}

此外 ,可參考java的實現:http://www.cnblogs.com/zyp4614/p/6555530.html

司機,售票員問題

問題:
司機開車,售票員售票。當售票員將門關上的時候司機才可以開車,當司機將車到站停下的時候,售票員才可以打開車門。

對S1(門): 門有兩個狀態,開和關。售票員將門關上之后,應該將門的操作權給司機(因為只有司機到站了才能停車)。因此0為門開着狀態。
對S2(車):兩個狀態,開車行駛和到站停車。當車開的時候,需要申請車的資源,即用wait,則車在停着的時候狀態為1,行駛時狀態為0.
司機:開車,正常行駛,到站停車
售票員:關門,售票,開門

S1表示是否允許司機啟動汽車;S1 = 1表示可以啟動,S2 = 0表示不能啟動。
S2表示是否允許售票員關車門;S2 = 1表示允許售票員關車門,S2 = 0表示不允許售票員關車門。

semaphore s1 = 1, s2 = 0;
void driver() {
  do {
    wait(s1);// P(S1)
    開車;
    正常行駛;
    到站停車;
    signal(s2);//V(S2)
  } while (true);
}
void seller() {
  do {
    關門;
    signal(s1);// V(S1)
    售票;
    wait(S2);//P(S2)
    開車門;
    上下乘客;
  } while (true);
}
void main() {
  cobegin
    driver(); seller();
  coend
}

可參考博客: http://m.blog.csdn.net/Y_215/article/details/53467517


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM