在完成lab7的时候突然考虑到ucore实现中一种情况可能会导致管程next_count大于1,但课上课下老师和同学说next_count不会大于1(我之前也一直认为不会大于1)
构造这种情况需要使用3个线程a,b,c、2个条件c1,c2,对应函数大概如下
- func_a(): wait(c1)
- func_b(): wait(c2) signal(c1)
- func_c(): signal(c2)
假设abc依次执行。
- 线程a遇到条件c1阻塞,于是在wait中关闭互斥锁。
- 线程b进入,遇到条件c2阻塞,并在wait中关闭互斥锁。
- 线程c进入,在signal函数中up条件c2的信号量,并down信号量next阻塞(Hoare机制),next_count为1
- 线程b继续执行,在signal函数中由于c1被线程a需求,于是线程b会up条件c1的信号量,并down信号量next阻塞,此时,next被down了两次,对应next_count为2
- 线程a结束,结束时唤醒线程b,唤醒后next_count减为1
- 线程b结束,结束时唤醒线程c,唤醒后next_count为0
- 线程c结束,关闭互斥锁