nt,num);РРРРРРРРРРРРРРРРРРРРРРРРРРР5、乘客进程的代码流程图:РР ? ?РР乘客开始判断售票大厅人数是否已满,若为满,则进程阻塞;若没有满,则进程接着判断售票大厅是否被占用,若有,则进程阻塞;若没有,则售票大厅被乘客占用,进程接着表示乘客进行购票,乘客进入售票大厅,通过全局变量num来统计售票大厅的人数,因为进来,所以num++,更改售票大厅人数;РРРРРРРРРР4、售票员进程Р1、线程结束的标志:当乘客全部购票完,且离开售票大厅。所以乘客的进程运行完后结束。而售票者的进程结束是线程结束的标志。乘客全部购票完则表示乘客号码等于输入的乘客数且此时最后一个乘客已经完成购票,全部离开售票大厅则表示售票大厅的人数为0.Р while(full <= 0){Р printf("售票大厅为空!\n");Р if(proCount==purchaserNum&&proCmutex==1)//判断售票员进程结束的标志:乘客全部离开售票大厅Р exit(0);//进程结束Р }//P(full),判断缓冲区是否为空Р2、售票者进程离开有界缓存区的实现:缓存区由数组表示,离开则表示缓存区的某个位置的某个数变为0。用out表示放入的位置,因为要知道离开的乘客,所以先取出乘客号,然后将该位置的值变为0。位置会改变,又因为是从数组下标0开始,所以向前推进,同时避免超出缓存区最大值,取余计算。同时,售票大厅的总人数减少一个。