处理同步和计数信号量



我正在学习计数信号量,但没有理解它。我几乎读过所有的文章,但仍然很难理解它。

以下是我对厕所关键示例的理解(http://niclasw.mbnet.fi/MutexSemaphore.html)这里,

卫生间-关键部分

密钥-信号量

人员-处理

如果我在上面说错了,请纠正我。我的问题是:

1) "信号量将共享资源的同时用户数量限制为最大数量"。对共享变量的同时访问难道不会导致条件的竞争吗?

2) 一个进程获取信号量后,它会在关键部分运行吗?(基于示例)

3) 如果一个进程在CS中,而另一个进程获取信号量,它会同时运行CS还是在等待?

对不起,如果我的问题很简单,但我很难理解。请用一个例子来解释信号量?

假设有一个贵宾室。房间里最多可以有3个人。将信号量设置为3。

信号灯是你的保镖,防止第四个人进入房间。

它是如何工作的?可以用信号量调用两个函数:wait()signal()

wait()函数简单地将信号量值减少1。如果新值为负值,则必须等待,直到该值再次为正值。

所以你从信号量=3开始。随着每个人进入房间,它减少了1。

人员1进入。。。sem=2

人2进入。。。sem=1

第3个人进入。。。sem=0

第4个人试图进入,但现在sem=-1,我们的保镖不让他进入。所以,他不得不等待直到,有人离开了房间!

当你完成关键部分时,你signal()让局外人知道他现在可以进入了。正如您所知,这个函数将信号量值增加1。

互斥是信号量=1。

线程A:

mutex.wait(); //makes mutex = 0
CS();
mutex.signal();

线程B:

mutex.wait(); //has to wait until A signals so the mutex = 1 again
CS();
mutex.signal();

有了这个实现,当A运行时,B不可能到达CS,在那里他通过上下文切换来更改一些全局变量。B必须等到A做完。反之亦然。

为了对信号量有更多的理解,你可以查看诸如producer&消费者、理发店、餐饮哲学家。。。他们很多。我相信这样会更有趣,场景会让你更容易理解。此外,我认为这是非常有用的。

希望这能有所帮助!

最新更新