ユニセックストイレの問題のシミュレーションに取り組んでいますが、コンセプトの実装に問題があります。この問題のサンプルコードソリューションをいくつか見てきましたが、それらはすべて複雑すぎて複雑すぎて理解できませんでした。
ミューテックスを使用して、main()がループ内に一連のスレッドを作成し、各スレッドが2つの関数enterBathroom()とleaveBathroom()を呼び出すシミュレーションを実装したいと思います。ミューテックスによってロックおよびロック解除されるグローバル変数を使用してすべてを追跡することにより、これら2つの関数をどのように実装しますか?
これが私のコードの構造/フレームワークに関して私がこれまでに持っているものです:
//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
}
バスルームの現在の性別を追跡するためにもう1つのミューテックスロックまたは変数を使用する必要があるかどうか、またはバスルームの占有者の総数を追跡するために別の整数が必要かどうかはわかりません。各関数内に一連の「if」ステートメントがあることは知っていますが、バックアップせずに機能しなかったときに、以前の実装の試みを削除したばかが好きです...
コードまたは正しい方向へのプッシュのいずれかで、どんな助けでもいただければ幸いです。ありがとう!
(明確にするために、バスルームは任意の時点で男性または女性のいずれかにすることができますが、両方にすることはできません。また、任意の1つの性別の無制限の数が一度にバスルームを使用できます)
(また、グローバル変数は、enterBathroom()およびleaveBathroomを呼び出す前に初期化されます)