我遇到的問題是在代碼部分運行之前信號量不會彼此等待。輸出看起來像:信號量不會彼此等待
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
TL; DR:您知道您必須按順序設置鎖定/解鎖嘗試,以避免死鎖? –
@πάνταῥεῖ我認爲這是sem_wait()和sem_post()的目的解鎖它 –
你可能會考慮使用['lock_guard'](http://en.cppreference.com/w/cpp/thread/lock_guard)機制來包裝這些調用。 –