2014-05-04 65 views
-1

我遇到的問題是在代碼部分運行之前信號量不會彼此等待。輸出看起來像:信號量不會彼此等待

Customer 1 arriving at lane 1 at 0 sec 
Customer 1 in now number 1 at lane 1 
Checkout1 now serving customer 1 for 10 sec 
Customer 2 arriving at lane 2 at 3 
Customer 2 in now number 1 at lane 2 
Checkout2 now serving customer 2 for 15sec 
Customer 3 arriving at lane 1 at 7 sec 
Customer 3 in now number 2 at lane 1 
Checkout1 now serving customer 3 for 8 sec 
Customer 4 arriving at lane 2 at 9 
Customer 4 in now number 2 at lane 2 
Checkout2 now serving customer 4 for 75sec 
Cusomter 1 has left checkout1 
Customer 5 arriving at lane 1 at 12 sec 
Customer 5 in now number 2 at lane 1 
Checkout1 now serving customer 5 for 20 sec 
Cusomter 3 has left checkout1 
Cusomter 2has left checkout2 
Cusomter 5 has left checkout1 
Cusomter 4has left checkout2 

的問題是,當checkout1正在處理customer1,將客戶應該離開處理其他人面前,然而,checkout1然後服務的另一個客戶是客戶3.然後靠近節目結束時,人們開始實際離開結賬。我很確定這是我的信號量的問題。

這裏是我的代碼簡單化版本:

sem_t *mem_mutexCheckout1Count; 
sem_t *mem_mutexCheckout2Count; 
sem_t *mem_mutexCheckout1Line; 
sem_t *mem_mutexCheckout2Line; 

int *pmemCheckout1Line; 
int *pmemCheckout2Line; 


int main() 
{ 
    for(int i = 0; i < myCustomers.size(); i++) 
    { 
     totalArrivalTime += myCustomers[i].arrival; 
     if((pid = fork()) == 0) 
     { 
      InLine(myCustomers[i].serial, totalArrivalTime, myCustomers[i].processing); 
      _exit(0); 
     } 
    } 
} 
void InLine(int serial, int arrivalTime, int time_interval) 
{ 
    sleep(arrivalTime); 
    if(*pmemCheckout1Line <= *pmemCheckout2Line) 
    { 
     cout << "Customer " << serial << " arriving at lane 1 at " << arrivalTime << " sec" << endl; 
     sem_wait(mem_mutexCheckout1Line); 
     *pmemCheckout1Line += 1; 
     sem_post(mem_mutexCheckout1Line); 
     cout << "Customer " << serial << " in now number " << *pmemCheckout1Line << " at lane 1" << endl; 

     sem_wait(mem_mutexCheckout1Count); 
     cout << "Checkout1 now serving customer " << serial << " for " << time_interval << " sec" << endl; 
     sleep(time_interval); 

     *pmemCheckout1Line -= 1; 
     cout << "Cusomter " << serial << " has left checkout1" << endl; 
     sem_post(mem_mutexCheckout1Count); 
    } 
    else 
    { 
     cout << "Customer " << serial << " arriving at lane 2 at " << arrivalTime << endl; 
     sem_wait(mem_mutexCheckout2Line); 
     *pmemCheckout2Line += 1; 
     sem_post(mem_mutexCheckout2Line); 
     cout << "Customer " << serial << " in now number " << *pmemCheckout2Line << " at lane 2" << endl; 

     sem_wait(mem_mutexCheckout2Count); 
     cout << "Checkout2 now serving customer " << serial << " for " << time_interval << "sec" << endl; 
     sleep(time_interval); 
     *pmemCheckout2Line -= 1; 

     cout << "Cusomter " << serial << "has left checkout2" << endl; 
     sem_post(mem_mutexCheckout2Count); 
    } 
} 

我myCustomers矢量看起來像

Vectorindex-Customerserial-timeElapsedSincePrevCustomer-ProcessTime 
------------- 
[0] 1 0 10 
[1] 2 3 15 
[2] 3 4 8 
[3] 4 2 75 
[4] 5 3 20 
+0

TL; DR:您知道您必須按順序設置鎖定/解鎖嘗試,以避免死鎖? –

+0

@πάνταῥεῖ我認爲這是sem_wait()和sem_post()的目的解鎖它 –

+0

你可能會考慮使用['lock_guard'](http://en.cppreference.com/w/cpp/thread/lock_guard)機制來包裝這些調用。 –

回答

0

我發現我的信號不在共享內存中,因此信號量無法正常工作。我做了:

mem_mutexCheckout1Count = (sem_t*) mmap(NULL, sizeof(mem_mutexCheckout1Count), PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 

給我所有的互斥鎖的修復。

0

如果你想阻止其他顧客在客戶面前,是誰是要被處理在當前處理的葉片上,僅使用一個信號量,當客戶正在處理並且在客戶正在離開時被鎖定,該信號被鎖定

if(*pmemCheckout1Line <= *pmemCheckout2Line) 
{ 

    cout << "Customer " << serial << " arriving at lane 1 at " << arrivalTime << " sec" << endl; 

    sem_wait(mem_mutexCheckout1Line); 

    *pmemCheckout1Line += 1; 

    cout << "Customer " << serial << " in now number " << *pmemCheckout1Line << " at lane 1" << endl; 

    cout << "Checkout1 now serving customer " << serial << " for " << time_interval << " sec" << endl; 
    sleep(time_interval); 

    *pmemCheckout1Line -= 1; 
    cout << "Cusomter " << serial << " has left checkout1" << endl; 

    sem_post(mem_mutexCheckout1Line); 
} 
+0

嘿,我改變它,但是,現在每個人都通過checkout1處理。它看起來像pmem正在增加。 –