0

我正在模拟男女皆宜的浴室问题,但我在实施这个概念时遇到了麻烦。我已经看到了一些解决该问题的示例代码,但它们都太复杂且过于复杂,我无法理解。

使用互斥体,我想实现一个模拟,其中 main() 在循环中创建一系列线程,每个线程调用两个函数:enterBathroom() 和 leaveBathroom()。通过使用由互斥锁锁定和解锁的全局变量来跟踪所有内容,我将如何实现这两个函数?

以下是我的代码结构/框架:

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

我不确定是否需要再使用一个互斥锁或变量来跟踪浴室的当前性别,或者是否需要另一个整数来跟踪浴室中的总人数。我知道每个函数中只是一系列“if”语句,但我喜欢一个白痴,我删除了我之前的实现尝试,当它没有备份就无法工作时......

任何帮助都将不胜感激,无论是代码还是朝着正确的方向推动。谢谢!

(为澄清起见,浴室在任何时候都可以是男性或女性,但不能同时是男性或女性,并且任何一种性别都可以无限数量地同时使用浴室)

(另外,全局变量在调用 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 回答