我用ACE中间件proactor模式编写了一个服务器程序,该模式本质上用了windows的完成端口收发网络包.但程序在双核(4个线程)操作系统上运行时,只有一个线程忙(占到50%以上),另3个线程比较空闲.如果收发网络包速度更大,其中一个线程可能会占到100%.完成端口应该是可扩展的,底层是多线程服务的,为什么还只有一个线程忙? 请指教!!!!

解决方案 »

  1.   

    没代码,难以分析你的问题。不过可能是你理解Proactor有误。Proactor和线程是交叉的关系。
    ──────────────────────
    国内专业的ACE网络编程、开发论坛开通:
    www.acejoy.com 
    www.acedevelop.com
    涉及ACE使用和开发,中间件、服务器端软件的设计,P2P技术,
    socket网络编程、应用开发等内容。
    欢迎加入,大家一起交流、学习成长!
      

  2.   

    我的代码可以简单的描述一下。
    //在界面线程中调用
    ACE_Asynch_Acceptor<CACEService> m_aceAcceptor;ACE_INET_Addr listen_addr( (u_short)8888);
    m_aceAcceptor.open (listen_addr,//建立监听 0,     // bytes_to_read
    0,     // pass_addresses
    ACE_DEFAULT_BACKLOG,
    1,     // reuse_addr
    0,     // proactor
    0);

    //在另一个后台线程中调用
    ACE_Proactor::instance()->proactor_run_event_loop(); 以后的收发都通过CACEService事例进行。
      

  3.   

    //在另一个后台线程中调用
    ACE_Proactor::instance()->proactor_run_event_loop(); 那不是只有一个线程在运行Proactor吗?──────────────────────
    国内专业的ACE网络编程、开发论坛开通:
    www.acejoy.com 
    www.acedevelop.com
    涉及ACE使用和开发,中间件、服务器端软件的设计,P2P技术,
    socket网络编程、应用开发等内容。
    欢迎加入,大家一起交流、学习成长!
      

  4.   

    //在另一个后台线程中调用
    ACE_Proactor::instance()->proactor_run_event_loop(); 
    只能表明只有一个线程处理从底层收到的网络包,和网络包的收发没有关系。真正的网络收发是完成端口对应的线程池完成的。
      

  5.   

    但是你只有一个线程在运行ACE_Proactor::instance()->proactor_run_event_loop(); 
    哪里来的线程池啊!!!
    ──────────────────────
    国内专业的ACE网络编程、开发论坛开通:
    www.acejoy.com 
    www.acedevelop.com
    涉及ACE使用和开发,中间件、服务器端软件的设计,P2P技术,
    socket网络编程、应用开发等内容。
    欢迎加入,大家一起交流、学习成长!
      

  6.   

    IOCP有个原则,即先进后出的原理来调度线程的。
      

  7.   

    IOCP有个原则,即先进后出的原理来调度线程的。
    我也知道这个原则。这个原则是不是一定导致如下结果:
    一个cpu占用到达100%,令一个cpu才会被调度。请指点?
    因为我写的程序占用某个cpu太高,领导怀疑我写的程序不优化。占用某个cpu过高对cpu也不好。
      

  8.   

    肯定不是,IOCP跑满负荷,也很难占用CPU到100%,这个规律有很多经验性的例子。一定是程序有问题。
      

  9.   

    程序每秒收包6万,发包1万,占用带宽超过20M。占用一个cpu超过80%。这应该正常。
      

  10.   

    之前做过一个驱动程序,多线程的。在intel双核机器上出现类似情况,在amd的机器上就能负载分散到每个cpu.呵呵,谁知道呢