2015-10-28 87 views
-5

我已經想出了以下解決方案的男女同浴浴室同步。中性浴室同步

的問題有以下限制:

  • 有一個共用浴室具有有限的容量。
  • 男性和女性不能使用衛生間的同時
  • 一個個體所能使用衛生間
  • 花任意一段時間內的個人不喜歡等待使用的衛生間(減少等待時間)
  • 的解決方案不應該偏向男性或女性。

有關該問題的詳細說明,請參閱link

下面提到的解決方案是否滿足所有問題約束?

僞代碼

int female_cnt = 0; 
mutex female_cnt_mutex; 

int male_cnt = 0; 
mutex male_cnt_mutex; 

mutex female_mutex; 
mutex male_mutex; 

semaphore restroom = N; 

female() 
{ 
    lock(female_mutex) 
    unlock(female_mutex) 

    lock(female_cnt_mutex) 

    female_cnt++; 
    if (female_cnt == 1) 
     lock(male_mutex) 

    unlock(female_cnt_mutex) 

    wait(restroom) 

    do_stuff(); 

    signal(restroom) 

    lock(female_cnt_mutex) 

    female_cnt--; 
    if (female_cnt == 0) 
     unlock(male_mutex) 

    unlock(female_cnt_mutex) 
} 

male() 
{ 
    lock(male_mutex) 
    unlock(male_mutex) 

    lock(male_cnt_mutex) 

    male_cnt++; 
    if (male_cnt == 1) 
     lock(female_mutex) 

    unlock(male_cnt_mutex) 

    wait(restroom) 

    do_stuff(); 

    signal(restroom) 

    lock(male_cnt_mutex) 

    male_cnt--; 
    if (male_cnt == 0) 
     unlock(female_mutex) 

    unlock(male_cnt_mutex) 
} 

回答

2

female功能的開始空臨界區

lock(female_mutex) 
    unlock(female_mutex) 

不會阻止雄()和雌性()來同時被執行。

如果female()male()在此之前關鍵部分其空臨界區後執行代碼,沒有什麼能阻止這兩種職能進行高達wait(restroom)。這種方式違反了第二個要求。