to be or no to be, that will be a question.我觉得假如程序一切正常的话,就够了,反正再用什么技术,用户才不会管呢。
今天突然想起来,好像不管像是同步读还是异步读,系统都会帮你生成线程的吧, 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:这是一小段代码。
一般windowsNT/2000/2003/XP下,每个进程最大地址空间为2G,呵呵,楼主自己看着办吧。最好还是用线程池
不过当我还是有疑问:
1、当线城池有几千个线程同时在运行时,那么CPU在线程上下文转换上面就要花费的时间和要耗费的内存比不用线城池少吗?
2、几千个线程要同时运行,线城池中的线程数量是不是也要几千个?
是的,我的每个线程都要运行几个小时,流程都是一个循环
while(!bStop)
{...
....
}
TO:sevencat(七猫) :
是的,正如您所说,我的设计可能有问题,不过,我不知道怎样才更有效,
我要做的工作是:
在主线程中:
WHILE(1)
{
。
AFXBEGINTHREAD(WORKTHREAD,(LPPARAM)LP,);//随时创建新的线程
}在几千个子线程WORKTHREAD中,LP不同,流程一样;
WHILE(!BSTOP)
{
}
每个线程都运行几个小时,
我也是这样认为的,不过我希望提高效率,要注意哪些问题?或者流程怎样更优化?再次谢谢了先:)
哪些操作容易造成阻塞?waitforsingleobject()?对设备读写操作?望指教
我就在想有没有更好的方法,希望大家多多指教,
TO :sevencat(七猫)
是的,
我的软件流程如前述,请问用线程池与不用线程池有多大差别?用线程池是不是也要开几千个线程?或者我对线程池理解的不对?
與我的問題相似:
http://community.csdn.net/Expert/topic/3194/3194353.xml?temp=.1311914
--------------------------
使用线程池时最起码系统的效率会得到很大的改善,而且也不会维护如此多的线程,用线程池是否要开几千个线程?这要看你的系统的实际情况来定,一般来说,采用线程池以后,需要的线程数量要比系统实际需要的数量要少 。假设你的系统设计初计划的客户端数量是1000个,那么你最多可以建立1000个线程来等待处理客户端的连接请求。也就是说:建立线程池的线程的数量<=系统实际的客户端数量。
这样的好处就是,每当一个客户端的请求抵达以后,不必新开一个线程来响应客户端的请求,那样新建线程、delete线程所需要的开销是非常大的,建立连接池以后,你直接唤醒一个空闲的线程来响应你的客户端请求就可以了,开销远远比原来的要小。
他说可能是读设备,估计在这里用的普通的文件读写方式,没用重叠IO读写。他也不说,我也不知。
大侠高见,我这里确实是用ReadFile阻塞读写的,没有用重叠IO读写,造成阻塞,谢谢!希望多多指教!
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:这是一小段代码。