我正在研究男女皆宜的浴室问题,我在实施这个概念时遇到了麻烦。我已经看到了一些问题的示例代码解决方案,但它们都过于复杂,而且过于复杂,我无法理解。
使用互斥锁,我想实现一个模拟,其中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之前初始化)
答案 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 *********/
}