一面试题,10条通讯管道,通讯时候遍历所有通讯管道,遇到空闲的管道让它工作,状态设置成忙碌,工作完毕状态设置成空闲,这样出现的问题是前几条管道总是处于忙碌状态,问什么办法解决这种问题,让工作分布的均匀些

解决方案 »

  1.   

    记录剩余空闲管道的数量n,
    产生一个1到n的随机数m,
    找到第m个空闲管道,使用
      

  2.   

    code=C#]
        SortedList WWW = new SortedList<管道序号, 时间>();
        当通讯信道由忙碌变为空闲时将管道序号及此时时间存进 WWW;
        当通讯信道由空闲变为忙碌时从 WWW 中删除相应的管道项;
        每次调用前历遍 WWW ,调用时间最早的管道;//第一轮不用历遍,直接按顺序一个管道一个管道地调用,直到所有管道都调用过一次.
    [/code]
    WWW 里存放的都是空闲的管道,且记录着上次使用完的时间,每次都取其中时间最早者,保证能平均分摊管道压力,不妨试试看.
    原理是这样,不过实现方法有很多种,上边的只是个不严谨的参考.
    [
      

  3.   


        SortedList<int, DateTime> WWW = new SortedList <管道序号, 时间>(); 
        当通讯信道由忙碌变为空闲时将管道序号及此时时间存进 WWW; 
        当通讯信道由空闲变为忙碌时从 WWW 中删除相应的管道项; 
        每次调用前历遍 WWW ,调用时间最早的管道;//第一轮不用历遍,直接按顺序一个管道一个管道地调用,直到所有管道都调用过一次. 

    WWW 里存放的都是空闲的管道,且记录着上次使用完的时间,每次都取其中时间最早者,保证能平均分摊管道压力,不妨试试看. 
    原理是这样,不过实现方法有很多种,上边的只是个不严谨的参考. 
      

  4.   

    最简单的是记录一下次上使用的最后一个管道的序号,下次时,直接从管道序号加一取,直到遇到空闲的管道。
    while (pipe.useingPipeSize() < N && !pipe(i).isUsing()) {
            i = (i + 1) % N;
    }
      

  5.   

    设定list来建立遍历顺序
    初始状态10个管道都是空闲的,list中初始的顺序就是0,1,2,3,4,5,6,7,8,9
    循环这个list中的记录去安排工作,当一个管道工作除了改状态为忙碌外再把他在数组中的位置放到最后一个
    就是说遍历的时候并不是按照管道的序号来遍历的还是按照list中的顺序(或者说是优先级顺序来遍历).