2012-10-24 44 views
0

我正在研究一個男女皆宜的浴室問題的模擬,並且我在實現這個概念時遇到了麻煩。我已經看到了一些針對該問題的示例代碼解決方案,但它們都太複雜而且過於複雜,以至於我無法理解。我想實現一個模擬,其中main()在循環中創建一系列線程,其中每個線程調用兩個函數:enterBathroom()和leaveBathroom()。通過使用由互斥鎖鎖定和解鎖的全局變量來跟蹤一切,我將如何去實現這兩個函數?我將如何實施一個鎖定系統來模擬不同性別的浴室?

這裏是我到目前爲止的我的代碼的結構/框架:

//Global Variables 
int maleCount, femaleCount, totalCount; 
pthread_mutex_t bathroomLock; 

EnterBathroom(int ID, bool isMale){ 
    //if(isMale) 
     //lock, increment maleCount or totalCount?, unlock 
    //else 
     //lock, increment femaleCount or totalCount?, unlock 
} 

LeaveBathroom(int ID, bool isMale){ 
    //Lock, decrement one of the variables?, unlock 
} 

我不知道我是否需要使用一個更互斥鎖或變量來保持當前的性別軌道的浴室或不是,或者我是否需要另一個整數來跟蹤浴室中佔有者的總數。我知道在每個函數中只是一系列的「if」語句,但我喜歡一個白癡,我刪除了我以前的實施嘗試,當它不起作用沒有備份時...

任何幫助都會不勝感激,無論是代碼還是隻是朝正確的方向推動。謝謝!

(只是爲了澄清,衛生間可以是男性或女性,在任何給定的點,但不能同時和無限數量的任何一個性別可以使用衛生間一次)

(也,全局變量在呼叫進入洗手間()並且離開浴室之前初始化)

回答

0

我建議使用通用結構而不是保留更多的全局變量。同時也可並行線程,你不能傳遞參數,這樣

int EnterBathroom(int ID, bool isMale); 

所以並行線程功能應該像

void* EnterBathroom(void*); 

多個參數可以通過形成它作爲一個結構傳遞給一個線程。同樣適用於LeaveBathroom()。有關pthread的更多信息,請參閱here

所以你的結構可以包含

/* Global Structure */ 
typedef struct 
{ 
    int maleCount; 
    int femaleCount; 
    int totalCount; 
}gData; 

/* Struct which is passed to thread */ 
typedef struct 
{ 
    int iUid; 
    unsigned char ucIsMale; 
}Input; 

示例代碼....

void *EnterBathroom(void* arg) 
    { 
    Input * inp = (Input*)arg; 

    /* Lock using Mutex **********/  

    if((inp->ucIsMale != 1) && (gData.maleCount == 0)) 
      gData.femaleCount++; 
    else if((inp->ucIsMale == 1) && (gData.femaleCount == 0)) 
      gData.maleCount++; 
    else 
      printf("\n Already occupied by Opposite Sex\n");    
    /* UnLock using Mutex *********/  

    } 
+0

感謝您的幫助!我知道我不能調用我的enterBathroom,並以我現在擁有的方式從pthread中離開浴室功能,但是我已經設置了這些函數,以便在線程函數本身內調用這些函數,當線程處於創建,但在線程中調用。這消除了你提到的問題不是嗎? – ahabos

+0

是的。在這種情況下,不會有問題。我只給了抽象的設計。 – Jeyaram

+0

我仍然不瞭解與進入浴室相關的各種情況。我知道這三種情況是: 1.浴室是空的 2.浴室是男性和新人是男性 3。浴室是男性和新的人是女性(我遺漏了2和3的相反,因爲它幾乎相同) 但我似乎無法包圍我的頭圍繞什麼變量增量以及如何鎖定這些變量如此環繞有互相排斥 – ahabos