我想写个多线程的扫端口程序(开上千线程那种),请问用哪个函数好??
AfxBeginThread,CreateThread,_createthreadex 或者别的高手给出答案并解释 谢谢.
[解决办法]
开上千线程?开。。。开。。。开玩笑吧?一个线程Stack 1M, 一千个县城光Stack就是1G内存。CPU全做Context Switching了。什么样的程序需要这么多线程?
这三个API意思差不多,你如果是MFC APP就用Afx,如果用Runtime了就用_beginthreadex(不是_create),User App很少直接用CreateThread,因为我们的程序都Link Runtime(除非你自己写Min CRT),CreateThread会造成Memory Leak。
[解决办法]
The number of threads a process can create is limited by the available virtual memory and depends on the default stack size.
If every thread has 1 MB of stack space, you can create a maximum of 32 threads.
If you reduce the default stack size, you can create more threads.
一楼说的是在default的情况下,而且如果在thread stack为1mb的情况下最多可以create 32个线程,但如果你减少stack size的可以创建多个线程。对于你说的同时能扫描1000个机器并不是开1000个threads,这是你理解上的错误,因为他是并发操作的,而非并行处理的。而同时处理这么多的机器不是简单的光开线程就能完成的。
[解决办法]
feimingbiao() ( ) 信誉:98 2007-09-07 09:20:26 得分: 0
cnvb(壮士沈), Windows下没有线程数的上限,你想建多少就建多少,直到你的虚拟内存光了为止,你观察到的2000多一点儿是因为每个线程缺省占1M空间,最后用了2G你的机器吐血了。
你把CreateThread的第二个参数从 0 改成 1024,这样就可以开 20 万个线程了。
------------------------
哦 对 不过没吐血,测试程序而已 呵呵 实际上没耗资源
fgwxybmt(++CV) ( ) 信誉:100 2007-09-07 10:03:02 得分: 0
我的程序有个banner 显示开端口的IP和线程目录的数量,建线程时的时间间隔是Sleep(1),在多数情况下的这个banner刷的都很慢,线程数量一直都不超过200, 但是有时不知道为什么速度就失控制,变的非常的快一能上1000多,但是影响了扫端口的质量,几乎扫不到什么. 好像与IP段无关,另外我肯定我没改过什么, 这种不稳定时不是的出现. 另外我提一下 我扫端口用的主要是connect这个函数!!
-------------------------------
你的函数改下先
BOOL Runflag=TRUE;
while(Runflag)
{
if(NULL==CreateThread())//省略
{
Runflag=FALSE;
}
else
//ok TODO:
}