我的服务器程序有几千个线程在同时运行,而且每个线程的运行时间都有至少几个小时,我想向大侠请教:我这里该不该用线程池?我感觉线程池主要是减少了线程的创建与销毁的时间,这对于频繁的短暂的线程很有益,但对于我这种不短暂的、大量的线程有必要吗?或者有什么更好的建议?

解决方案 »

  1.   

    windows是的CPU时间分配是以线程为基本单位的,几千个线程,CPU在线程上下文转换上面就要花费不少时间,而且每个线程都要耗费一定的内存,一般默认是2M,这么多的线程,会花费你系统大量的内存资源。
    一般windowsNT/2000/2003/XP下,每个进程最大地址空间为2G,呵呵,楼主自己看着办吧。最好还是用线程池
      

  2.   

    谢谢 huang_yu(HY) :
    不过当我还是有疑问:
    1、当线城池有几千个线程同时在运行时,那么CPU在线程上下文转换上面就要花费的时间和要耗费的内存比不用线城池少吗?
    2、几千个线程要同时运行,线城池中的线程数量是不是也要几千个?
      

  3.   

    TO:betsyalan(alan) :
    是的,我的每个线程都要运行几个小时,流程都是一个循环
    while(!bStop)
    {...
    ....
    }
    TO:sevencat(七猫) :
    是的,正如您所说,我的设计可能有问题,不过,我不知道怎样才更有效,
      

  4.   

    TO:sevencat(七猫) :
    我要做的工作是:
    在主线程中:
    WHILE(1)
    {

    AFXBEGINTHREAD(WORKTHREAD,(LPPARAM)LP,);//随时创建新的线程
    }在几千个子线程WORKTHREAD中,LP不同,流程一样;
    WHILE(!BSTOP)
    {


    }
    每个线程都运行几个小时,
      

  5.   

    谢谢sevencat(七猫) 
    我也是这样认为的,不过我希望提高效率,要注意哪些问题?或者流程怎样更优化?再次谢谢了先:)
      

  6.   

    谢谢sevencat(七猫) :
    哪些操作容易造成阻塞?waitforsingleobject()?对设备读写操作?望指教
      

  7.   

    WIN下面的设备读取都有非堵塞的方法吧,假如是用CreateFile打开的话。
      

  8.   

    TO: lwglucky(才鸟) :
    我就在想有没有更好的方法,希望大家多多指教,
    TO :sevencat(七猫)
    是的,
      

  9.   

    ms-help://MS.MSDNQTR.2003FEB.2052/fileio/base/reading_and_writing_asynchronously.htm这里面有一点介绍,不过文件的异步读写我也没用过。套接字异步读写我用过的。
      

  10.   

    to :B2China(海陆空天电磁) 
    我的软件流程如前述,请问用线程池与不用线程池有多大差别?用线程池是不是也要开几千个线程?或者我对线程池理解的不对?
      

  11.   

    GZ!!!
    與我的問題相似:
    http://community.csdn.net/Expert/topic/3194/3194353.xml?temp=.1311914
      

  12.   

    hohai(gg)
    --------------------------
    使用线程池时最起码系统的效率会得到很大的改善,而且也不会维护如此多的线程,用线程池是否要开几千个线程?这要看你的系统的实际情况来定,一般来说,采用线程池以后,需要的线程数量要比系统实际需要的数量要少 。假设你的系统设计初计划的客户端数量是1000个,那么你最多可以建立1000个线程来等待处理客户端的连接请求。也就是说:建立线程池的线程的数量<=系统实际的客户端数量。
    这样的好处就是,每当一个客户端的请求抵达以后,不必新开一个线程来响应客户端的请求,那样新建线程、delete线程所需要的开销是非常大的,建立连接池以后,你直接唤醒一个空闲的线程来响应你的客户端请求就可以了,开销远远比原来的要小。
      

  13.   

    可能是ReadFile阻塞读写阻塞的。
    他说可能是读设备,估计在这里用的普通的文件读写方式,没用重叠IO读写。他也不说,我也不知。
      

  14.   

    to:sevencat(七猫) 
    大侠高见,我这里确实是用ReadFile阻塞读写的,没有用重叠IO读写,造成阻塞,谢谢!希望多多指教!
      

  15.   

    to be or no to be, that will be a question.我觉得假如程序一切正常的话,就够了,反正再用什么技术,用户才不会管呢。
      

  16.   

    今天突然想起来,好像不管像是同步读还是异步读,系统都会帮你生成线程的吧,
    00434 
    00435     if ( status == STATUS_PENDING &&
    00436             lpOverlapped == NULL )
    00437     {
    00438 
    00439         BOOL success;
    00440 
    00441         success = SockWaitForSingleObject(
    00442                       event,
    00443                       Handle,
    00444                       SOCK_CONDITIONALLY_CALL_BLOCKING_HOOK,
    00445                       SOCK_SEND_TIMEOUT
    00446                   );
    00447 
    00448         //
    00449         // If the wait completed successfully, look in the IO status
    00450         // block to determine the real status code of the request.  If
    00451         // the wait timed out, then cancel the IO and set up for an
    00452         // error return.
    00453         //
    00454 
    00455         if ( success )
    00456         {
    00457 
    00458             status = ioStatusBlock->Status;
    00459 
    00460         }
    00461         else
    00462         {
    00463 
    00464             SockCancelIo( Handle );
    00465             status = STATUS_IO_TIMEOUT;
    00466         }
    00467 
    00468     }
    00469 
    00470     switch (status)
    00471     {
    00472     case STATUS_SUCCESS:
    00473         break;
    00474 
    00475     case STATUS_PENDING:
    00476         err = WSA_IO_PENDING;
    00477         goto exit;
    00478 
    00479     default:
    00480         if (!NT_SUCCESS(status) )
    00481         {
    00482             //
    00483             // Map the NTSTATUS to a WinSock error code.
    00484             //
    00485 
    00486             err = SockNtStatusToSocketError( status );
    00487             goto exit;
    00488         }
    00489     }
    00490 
    00491     //
    00492     // The request completed immediately, so return the number of
    00493     // bytes sent to the user.
    00494     // It is possible that application deallocated lpOverlapped
    00495     // in another thread if completion port was used to receive
    00496     // completion indication. We do not want to confuse the
    00497     // application by returning failure, just pretend that we didn't
    00498     // know about synchronous completion
    00499     //
    00500 
    00501     __try {
    00502         *lpNumberOfBytesSent = (DWORD)ioStatusBlock->Information;
    00503     }
    00504     __except (EXCEPTION_EXECUTE_HANDLER)
    00505     {
    00506         if (lpOverlapped)
    00507         {
    00508             err = WSA_IO_PENDING;
    00509         }
    00510         else
    00511         {
    00512             err = WSAEFAULT;
    00513         }
    00514         goto exit;
    00515     }
    00516 
    00517 exit:这是一小段代码。