宿題として、バスルームの同期問題が与えられました。どのように始めたらよいのか、ずっと悩んでいました。人がトイレに入ったときにやりたいこと(personEnterRestrrom関数)、彼らが女性で、男性が入ったトイレにいない場合、女性が待っている列に入る. 男性にも同じことをしたいです。スレッドを保持するキューを実装しようとしましたが、機能させることができません。次に、personLeavesRestroom 関数で。トイレに誰も残っていない場合、人が去ると、別のキューが開始されます。これが私のコードです。ガイダンスが必要であり、セマフォにあまり慣れていないため、私は遠く離れていることを知っています。
//declarations
pthread_mutex_t coutMutex;
int menInBath;
int womanInBath;
int menWaiting;
int womenWaiting;
queue<pthread_mutex_t>men;
queue<pthread_mutex_t>women;
personEnterRestroom(int id, bool isFemale)
{
// LEAVE THESE STATEMENTS
pthread_mutex_lock(&coutMutex);
cout << "Enter: " << id << (isFemale ? " (female)" : " (male)") << endl;
pthread_mutex_unlock(&coutMutex);
// TODO: Complete this function
if(isFemale && menInBath<=0)
{
womanInBath++;
}
else if(isFemale && menInBath>0)
{
wait(coutMutex);
women.push(coutMutex);
}
else if(!isFemale && womanInBath<=0)
{
menInBath++;
}
else
{
wait(coutMutex);
men.push(coutMutex);
}
}
void
personLeaveRestroom(int id, bool isFemale)
{
// LEAVE THESE STATEMENTS
pthread_mutex_lock(&coutMutex);
cout << "Leave: " << id << (isFemale ? " (female)" : " (male)") << endl;
pthread_mutex_unlock(&coutMutex);
if(isFemale)
womanInBath--;
if(womanInBath==0)
{
while(!men.empty())
{
coutMutex=men.front();
men.pop();
signal(coutMutex);
}
}
}