整个评分过程T分钟。每个学生的评分过程(K个老师同时给其评分)D分钟。最后D分钟,不能开始任何评分过程,所有无关的老师和学生都要离场。最初所有的老师都在考场,每个老师评完N个学生后离场。学生以任意顺序进场,找到K个老师后开始评分。
学生:1.等待(random()%(T-D)分钟2.进考场3.等K个老师4.评分5.离场
老师:1。进考场2.重复N次a等学生来找b等待学生找够K个老师并开始评分c评分
3.离场
学生和老师都得用thread表示(不能用mutex)。
请教如何实现?
怎么才能使老师同时只被一个学生访问?
11 个解决方案
#1
对每个老师是否在评分可以高一个标志位。不过可能有更好的方法。我不知道。
#2
线程也不一定能够解决问题,关键问题是写程序不能浪费时间,实际问题是不浪费中间时间,还要最优的安排老师对学生评分,学生为一个队列,排队去评分,有个调度程序安排学生去减老师,到了一定的时间再把新的学生安排进去,要是没有个别情况,直接相当于给学生在安排时间这么一个流程。
#3
不用保证公平,不一定等的最长的学生优先找老师。
#4
:)
#5
可以用三个信号灯.一个是在等待的学生waitstudent,一个空闲的老师freeteacher.一个是可否入场canenter.每个老师给一个学生评完分后信号灯加一值>=K时放一个学生进场.在等待的学生减一.(一个老师同时只能给一个学生评分)这样每个老师一个线程,每个学生一个线程.学生进场后选老师.每选中一个老师的信号量减一.在选好K个之前,不能有其它的学生入场.(否则,M<2k时会有死锁.)在场的学生选好K老师后,入场的信号量加一.学生入场后,入场的信号量减一.这样就要如下的线程:
mian()
{
if (freeteacher>K)
canenter++;
if (waitsutdent>0 && canenter)
enter()
}
teacher()
{
if (choiced)
}
有事,不写具体的了.我的思路是这样的.
mian()
{
if (freeteacher>K)
canenter++;
if (waitsutdent>0 && canenter)
enter()
}
teacher()
{
if (choiced)
}
有事,不写具体的了.我的思路是这样的.
#6
bwtBWT:最好用类.学生,老师数据的设定可以在主线程中设一个输入.
#7
我想我没说明白。学生是随意进场的。等待(random()%(T-D)分钟。不考虑死锁。
#8
还有,K个老师是同时给一个学生评分的。(等找够了老师,同时开始)。D分钟后结束。
#9
没有人会吗?
这样对不对?给每个老师的线程设两个condition variable,学生每找到一个老师,就signal老师第一个condition variable,然后老师就把标志位设为忙。学生找够n个老师以后,就signal老师的第二个condition variable,并且delay D分钟。然后老师就开始评分(delay D分钟)。
行吗?
这样的话,等待的老师就要确认signal是哪个学生来的。
这样是不是要设S个condition variable?
这样对不对?给每个老师的线程设两个condition variable,学生每找到一个老师,就signal老师第一个condition variable,然后老师就把标志位设为忙。学生找够n个老师以后,就signal老师的第二个condition variable,并且delay D分钟。然后老师就开始评分(delay D分钟)。
行吗?
这样的话,等待的老师就要确认signal是哪个学生来的。
这样是不是要设S个condition variable?
#10
不知道一个老师可不可以同时接受多个学生的请求.
如果可以,一个老师最多可以接受N个学生的请求.完成后离开.每个学生可以先后向K个老师请求,找够K个老师后给这K个老师Signal.
如果可以,一个老师最多可以接受N个学生的请求.完成后离开.每个学生可以先后向K个老师请求,找够K个老师后给这K个老师Signal.
#11
一个老师不可以同时接受多个学生的请求。
#1
对每个老师是否在评分可以高一个标志位。不过可能有更好的方法。我不知道。
#2
线程也不一定能够解决问题,关键问题是写程序不能浪费时间,实际问题是不浪费中间时间,还要最优的安排老师对学生评分,学生为一个队列,排队去评分,有个调度程序安排学生去减老师,到了一定的时间再把新的学生安排进去,要是没有个别情况,直接相当于给学生在安排时间这么一个流程。
#3
不用保证公平,不一定等的最长的学生优先找老师。
#4
:)
#5
可以用三个信号灯.一个是在等待的学生waitstudent,一个空闲的老师freeteacher.一个是可否入场canenter.每个老师给一个学生评完分后信号灯加一值>=K时放一个学生进场.在等待的学生减一.(一个老师同时只能给一个学生评分)这样每个老师一个线程,每个学生一个线程.学生进场后选老师.每选中一个老师的信号量减一.在选好K个之前,不能有其它的学生入场.(否则,M<2k时会有死锁.)在场的学生选好K老师后,入场的信号量加一.学生入场后,入场的信号量减一.这样就要如下的线程:
mian()
{
if (freeteacher>K)
canenter++;
if (waitsutdent>0 && canenter)
enter()
}
teacher()
{
if (choiced)
}
有事,不写具体的了.我的思路是这样的.
mian()
{
if (freeteacher>K)
canenter++;
if (waitsutdent>0 && canenter)
enter()
}
teacher()
{
if (choiced)
}
有事,不写具体的了.我的思路是这样的.
#6
bwtBWT:最好用类.学生,老师数据的设定可以在主线程中设一个输入.
#7
我想我没说明白。学生是随意进场的。等待(random()%(T-D)分钟。不考虑死锁。
#8
还有,K个老师是同时给一个学生评分的。(等找够了老师,同时开始)。D分钟后结束。
#9
没有人会吗?
这样对不对?给每个老师的线程设两个condition variable,学生每找到一个老师,就signal老师第一个condition variable,然后老师就把标志位设为忙。学生找够n个老师以后,就signal老师的第二个condition variable,并且delay D分钟。然后老师就开始评分(delay D分钟)。
行吗?
这样的话,等待的老师就要确认signal是哪个学生来的。
这样是不是要设S个condition variable?
这样对不对?给每个老师的线程设两个condition variable,学生每找到一个老师,就signal老师第一个condition variable,然后老师就把标志位设为忙。学生找够n个老师以后,就signal老师的第二个condition variable,并且delay D分钟。然后老师就开始评分(delay D分钟)。
行吗?
这样的话,等待的老师就要确认signal是哪个学生来的。
这样是不是要设S个condition variable?
#10
不知道一个老师可不可以同时接受多个学生的请求.
如果可以,一个老师最多可以接受N个学生的请求.完成后离开.每个学生可以先后向K个老师请求,找够K个老师后给这K个老师Signal.
如果可以,一个老师最多可以接受N个学生的请求.完成后离开.每个学生可以先后向K个老师请求,找够K个老师后给这K个老师Signal.
#11
一个老师不可以同时接受多个学生的请求。