我如何实施锁定系统来模拟改变性别的浴室?

时间:2012-10-24 08:24:26

标签: locking pthreads mutex semaphore

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

使用互斥锁,我想实现一个模拟,其中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之前初始化)

1 个答案:

答案 0 :(得分:0)

我建议使用通用结构而不是保留更多的全局变量。而且在pthread中你不能传递像这样的参数

int EnterBathroom(int ID, bool isMale);

所以pthread函数应该像

void* EnterBathroom(void*);

通过将一个参数形成为一个结构,可以将多个参数传递给一个线程。同样适用于LeaveBathroom()。有关pthreads的更多信息,请参阅here

所以你的结构可能包含

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

  }