0

ユニセックストイレの問題のシミュレーションに取り組んでいますが、コンセプトの実装に問題があります。この問題のサンプルコードソリューションをいくつか見てきましたが、それらはすべて複雑すぎて複雑すぎて理解できませんでした。

ミューテックスを使用して、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を呼び出す前に初期化されます)

4

1 に答える 1

0

より多くのグローバル変数を保持する代わりに、一般的な構造を使用することをお勧めします。また、pthread では、このようなパラメーターを渡すことはできません

int EnterBathroom(int ID, bool isMale);

したがって、pthread関数は次のようになります

void* EnterBathroom(void*);

スレッドを構造体として形成することにより、複数の引数をスレッドに渡すことができます。同じことが LeaveBathroom() にも当てはまります。pthread の詳細については、こちらを参照してください。

したがって、構造体に含まれる可能性があります

/* 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 *********/    

  }
于 2012-10-24T09:27:01.653 に答える