两个生产者,每个都生产三十次。两个消费者,每个都消费三十次。篮子初始化四个苹果,总容量十个。full为semaphone(4)empty为semaphore(6)mutex为全局锁semaphore(1)消费者:full.Wai...
两个生产者,每个都生产三十次。
两个消费者,每个都消费三十次。
篮子初始化四个苹果,总容量十个。
full 为 semaphone(4)
empty 为 semaphore(6)
mutex 为全局锁 semaphore(1)
消费者:
full.Wait();
mutex.Wait();
消费....
mutex.Signal();
empty.Signal();
生产者:
empty.Wait();
mutex.Wait();
生产....
mutex.Signal();
full.Signal
Semaphore 同步的 Wait() {
this.value--;
if(value<0) wait; // 省略 try catch
}.
常规的 Semaphore 使用 while(value < 0) 控制 wait(). 但是上述的 Semaphore 使用 while() 就死锁,使用 if 没有任何问题。
我的问题:
问题1:
两个消费者都 wait() 等待生产者时,生产者生产完 mutex.Signal() 中有 notify(), full.Signal() 中又有 notify(), 这里唤醒了大家几次?
问题2:
两个消费者都 wait() 等待生产者时,生产者生产完一个通知大家,如果等待的消费者1抢到机会开始消费,之后释放mutex锁时 notify() 通知大家,如果等待的消费者2抢到机会消费,但是却是没有可以消费的... 这里是怎么造成的那?
谢谢
因为标准的 Semaphore 不允许负值,使用 while(value<=0) 进行 wait(), 然后才能 value--.
但是如果允许负值,则可以实现等待队列。这个问题就是要实现队列。如果使用 value--; while(value<0) wait() 就会死锁,但是需要修改为 if 才没有死锁。这是为什么那?
展开