信号量和并发编程
对于家庭作业,我需要编写以下场景。这将通过使用 BACI(即 C--)的信号量来完成。
有 2 个男女通用的卫生间,每个可容纳 4 人。由于它是男女通用的,所以只有同性别的人可以同时进入卫生间,先进先出并不重要。我脑子里有一个基本的“算法”,可以处理 4 个男人和 4 个女人共用 1 个卫生间。但我不知道如何编码。任何帮助将不胜感激。这是我所拥有的。
Woman:
Check to see if there are any men in the restroom. If so "wait".
If no men check to see if there are 4 people. If so "wait".
If no men and not 4 use restroom. When leaving signal there is a vacancy.
If last woman signal the men if they are waiting if not signal the woman.
Man:
check to see if there are any woman in the restroom. if so "wait"
If no woman check to see if there are 4 people. If so "wait".
If no woman and not 4 use restroom. when leaving signal there is a vacancy.
if last man signal the women if they are waiting if not signal the men.
提供了这些附加说明
使用随机 FOR 循环在适当的位置模拟时间的流逝。这可以通过使用 Delay 函数轻松完成:
无效延迟(无效) { 整数我; int 延迟时间; 延迟时间=随机(DELAY); for (i = 0; i < DelayTime; i++): }
where const int DELAY = 10 到 100 之间的某个数字。
- 很好地打印和格式化输出并打印消息通过读取输出,可以跟踪执行顺序。
- 将进程设置为永远循环,并使用 Control C(或 Control Break)来停止程序。
For a homework assignment i need to program the following scenario. This is going to be done using semaphores using BACI (which is C--)
There are 2 unisex restrooms that can hold 4 people each. Since it is unisex only people of the same sex can be in the restroom at the same time and FIFO is not important. I have the basic "algorithm" in my head to handle 4 men and 4 woman for 1 restroom. But i don't know how to code this. Any help would be greatly appreciated. Here is what I have.
Woman:
Check to see if there are any men in the restroom. If so "wait".
If no men check to see if there are 4 people. If so "wait".
If no men and not 4 use restroom. When leaving signal there is a vacancy.
If last woman signal the men if they are waiting if not signal the woman.
Man:
check to see if there are any woman in the restroom. if so "wait"
If no woman check to see if there are 4 people. If so "wait".
If no woman and not 4 use restroom. when leaving signal there is a vacancy.
if last man signal the women if they are waiting if not signal the men.
These additional instructions were provided
Use random FOR loops to simulate the passage of time in the appropriate places. This can be easily done by using a Delay function:
void Delay (void) { int i; int DelayTime; DelayTime = random (DELAY); for (i = 0; i < DelayTime; i++): }
where const int DELAY = some number from 10 to 100.
- Print and format output nicely and print messages in such a way that by reading the output, one can trace the execution order.
- Set the processes up to loop forever, and use control C (or control break) to stop your program.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
由于您想知道
如何为 1 个卫生间编写算法
,我已经用 C 语言编写了代码。将其转换为 C 语言将是一个相当简单的任务,因为所有信号量结构看起来都很简单相似的。根据我对您的回答的理解,
请记住,如上所述,我仅解决了 1 个卫生间 的问题。由于这是作业,我希望您自己将其扩展为2 个卫生间形式。
从读者-作者问题到我们的“男女通用卫生间”问题,我们提出使用以下全局变量:
合并这些信号量和计数器放入
man
线程函数中,同样,在女线程函数中,将
mcount
替换为wcount
,将msem
替换为 <代码>wsem,以及x
和y
。只有z
保留在man
函数中,因此man
和z
都保持原样。女
线程在同一个公共信号量上排队。 (因此,代码总是具有类似 FIFO 的行为,从而确保公平/非饥饿)完整的代码如下:(要编译,请使用
gcc filename -lpthread
)在转换为 2-restrooms 形式时,记下哪些信号量和信号量您需要复制计数器变量才能满足所有条件。快乐信号传递!
Since you want to know
how to code your algorithm for 1 restroom
, I have done so in C. It will be a fairly simple task to convert it into C--, as all the semaphore constructs appear quite similar.From what I could make of your answer,
Bear in mind, as stated, I have worked out the problem for 1-restroom only. Since this is homework, I expect you to expand it into the 2-restrooms form yourself.
Working one's way from the Readers-writers problem to our "Unisex Restroom" problem, we make use of the following global variables:
Incorporating these semaphores & counters into the
man
thread function,Similarly, the woman thread function, substitutes
mcount
withwcount
,msem
withwsem
, andx
withy
. Onlyz
remains as is in theman
function, so that bothman
&woman
threads queue up on the same common semaphore. (Due to this, the code invariably has FIFO-like behaviour, which ensures fairness/non-starvation)The complete code is as follows: (To compile, use
gcc filename -lpthread
)While converting into the 2-restrooms form, make note of which semaphores & counter variables you would need to duplicate to satisfy all the conditions. Happy semaphoring!
这是我所拥有的。这使得一次可以有 1 个人在卫生间里,而不会出现僵局或饥饿。我需要帮助来了解如何让 4 个人同时使用洗手间。
Here is what I have. This allows 1 person in the restroom at a time without deadlock or starvation. I'm in need of assistance with how to make it so 4 people can be in the restroom at a time.
4 个卫生间 baci 代码:
for 4 restroom baci code :