该例子是一个生产者一个消费者,缓冲区是1,如果缓冲区很大这个问题就会被忽视了,如果生产者和消费者数量增加,那么死锁概率也会增加
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void wait(struct condvar *cv, mutex_t *mutex){ mutex_lock(&cv -> lock); cv -> nwait++; mutex_unlock(&cv -> lock);
mutex_unlock(mutex); P(&cv -> sleep); mutex_lock(mutex); }
|
问题是,为什么前一个线程执行完的broadcast后,consumer(12896)为什么没被唤醒,而后面的producer(12897)被唤醒了,而且例子中只有一个生产者和一个消费者,缓冲区大小为1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| ------Consumer: begin, execution count: 12896------ Consumer: Waiting ------waiting------ in wait nwait: 1 waiting before sleep
------Producer: begin, execution count: 12896------ ( depth = 1 Producer: Broadcast ------broadcast_start------ start broadcast int broadcast nwait: 1 ------broadcast_end------ ------Producer: end, execution count: 12896------ ------Producer: begin, execution count: 12897------ Producer: Waiting ------waiting------ in wait nwait: 1 waiting before sleep ------waiting out------ Producer: Waiting ------waiting------ in wait nwait: 2 waiting before sleep
|