之前讲了QNX上Mutex的使用,Mutex作用是锁住一个资源,保证同一时间只有一个线程可以使用该资源。不过,有些情况下Mutex不能满足需求,比如某个资源可以允许两个线程同时访问,但是不允许超过两个线程访问它。这种情况下如果还是使用Mutex的话只有一个线程可以访问该资源,没有充分利用允许两个线程访问的属性。Semaphore就适合这种情况,Semaphore翻译成“信号灯”,主要是通过信号灯的数量控制访问资源的线程数。
下面通过一个形象一点的例子说明Semaphore的使用。
假设有3个连队的士兵要通过一座桥,不过这座桥同时只能有两个人通过,有三个人通过的话就会垮掉。士兵们知道了桥的情况,所以在连队内做了规定,士兵们排队通过,只有前面的士兵通过桥之后,排在后面的一个士兵才能上桥。
不过连队内的规定并不能解决问题,虽然3个连队的士兵都按连队内的规定逐个通过,但是连队之间没有协定,3个连队的第一个士兵都走上了桥,桥就垮了。因此,需要在连队之间再做一个协定(这就是多线程同步了)。
就假设军队里有个厉害的工兵,在桥上安装了个信号灯装置(就是Semaphore了),桥头有个按钮,桥尾有个按钮,桥头的按钮按一下桥上就亮起一盏灯,桥尾的按钮按一下桥上就灭一盏灯。
有了这个装置,剩下的就是给连队下规定了,规定每个连队派人上桥之前要确定桥上的灯不能亮两盏(当然也不能是两盏以上)。如果两盏灯都是亮的,必须等待到有灯灭了才可以上桥。同时,士兵上桥之前要按一下桥头的按钮,下桥的时候要按一下桥尾的按钮。
这样,3个连队的士兵都可以安全过桥了,前提是大家都按规定使用信号灯。<