我有一个服务器,负责监听客户的请求,并处理
UINT ListThread()
{
   while(1)
 {
   recv(...)
   {
      //处理业务
   }
 }
}
现在考虑处理业务可能需要一定的时间耗费,而同时请求服务器的人可能很多,其他的请求需要进行排队等候.考虑将上面的原型改成下面的
UINT ListThread()
{
   while(1)
 {
   recv(...)
   {
      CreateThread(0,DoThread...);   
   }
 }
}UINT DoThread()
{
  //处理业务}这个方式是服务器一旦受到一个请求以后马上创建一个新的线程进行处理业务,而其继续监听.请问这样的方式好不好.如果请求比较多,是不是比较耗费资源,
如果好,好在哪里.如果不好,问题在哪里?
或者你有什么好的建议?

解决方案 »

  1.   

    1) 创建一个完成端口。第四个参数保持为0,指定在完成端口上,每个处理器一次只允许执行一个工作者线程。
    2) 判断系统内到底安装了多少个处理器。
    3) 创建工作者线程,根据步骤2 )得到的处理器信息,在完成端口上,为已完成的I / O请求
    提供服务。在这个简单的例子中,我们为每个处理器都只创建一个工作者线程。这是由于事
    先已预计到,到时不会有任何线程进入“挂起”状态,造成由于线程数量的不足,而使处理
    器空闲的局面(没有足够的线程可供执行)。调用C r e a t e T h r e a d函数时,必须同时提供一个工
    作者例程,由线程在创建好执行。本节稍后还会详细讨论线程的职责。
    4) 准备好一个监听套接字,在端口5 1 5 0上监听进入的连接请求。
    5) 使用a c c e p t函数,接受进入的连接请求。
    6) 创建一个数据结构,用于容纳“单句柄数据”,同时在结构中存入接受的套接字句柄。
    7) 调用C r e a t e I o C o m p l e t i o n P o r t,将自a c c e p t返回的新套接字句柄同完成端口关联到一起。
    通过完成键(C o m p l e t i o n K e y)参数,将单句柄数据结构传递给C r e a t e I o C o m p l e t i o n P o r t。
    8) 开始在已接受的连接上进行I / O操作。在此,我们希望通过重叠I / O机制,在新建的套
    接字上投递一个或多个异步W S A R e c v或W S A S e n d请求。这些I / O请求完成后,一个工作者线
    程会为I / O请求提供服务,同时继续处理未来的I / O请求,稍后便会在步骤3 )指定的工作者例程
    中,体验到这一点。
    9) 重复步骤5 ) ~ 8 ),直至服务器中止。
      

  2.   

    嗯,一个线程负责listen,一个accept处理
      

  3.   

    楼上的,要一个线程listen干什么?
    奇怪
      

  4.   

    一个线程监听,等待客户端的连接,收到以后就启动一个线程,然后把Socket传给启动的线程与客户断交谈,这种解决方案相对简单点,要是写复杂的,那你就用完成端口。
      

  5.   

    哦,我用的是UDP,谁有UDP完成端口的例子,可发给我啊