我正在学习计数信号量,但没有理解它。我几乎读过所有的文章,但仍然很难理解它。
以下是我对厕所关键示例的理解(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&消费者、理发店、餐饮哲学家。。。他们很多。我相信这样会更有趣,场景会让你更容易理解。此外,我认为这是非常有用的。
希望这能有所帮助!