GetSystemInfo(&SystemInfo);for(i = 0; i < SystemInfo.dwNumberOfProcessors * 2; i++)
{
HANDLE ThreadHandle;// 创建一个线程,把上面创建的完成端口传给线程
if ((ThreadHandle = CreateThread(NULL, 0, ServerWorkerThread, CompletionPort,
0, &ThreadID)) == NULL)
{
printf("CreateThread() failed with error %d\n", GetLastError());
return;
}
//如果我的服务器是一个CPU的话,是不是就创建了两个ServerWorkerThread?还是我创建了两次,而这两次创建的线程有着同样的入口地址呢?CloseHandle(ThreadHandle);
}
{
HANDLE ThreadHandle;// 创建一个线程,把上面创建的完成端口传给线程
if ((ThreadHandle = CreateThread(NULL, 0, ServerWorkerThread, CompletionPort,
0, &ThreadID)) == NULL)
{
printf("CreateThread() failed with error %d\n", GetLastError());
return;
}
//如果我的服务器是一个CPU的话,是不是就创建了两个ServerWorkerThread?还是我创建了两次,而这两次创建的线程有着同样的入口地址呢?CloseHandle(ThreadHandle);
}
国内专业的ACE论坛开通:
www.acejoy.com
www.acedevelop.com
涉及ACE使用和开发,服务器端软件的设计,P2P技术,
网络编程等内容。
欢迎加入,大家一起交流、学习成长!
是应用程序收到客户端的连接请求,就将其关联到(associated)一个IOCP端口,
IOCP通过CreateIOCompletionPort函数将绑定后的用来传数据的socket关联一个键值,
关联之后IOCP就一边通知应用程序可以accept,一边投递一个消息到操作系统的队列中.
之后应用程序的工作者线程在操作系统读到该消息的时候被启动,是这样的吗?当工作者线程将数据发完之后,需要通知IOCP,应用程序,操作系统三者,还是仅仅通知IOCP?IOCP只负责将连接请求关联到一个键值,然后放到操作系统的队列中,然后就去继续等待别的连接请求了,是不是?等到IO设备真正准备好了,被使用了发送完成了,再给出一个消息通知应用程序,是不是?欢迎指出我的理解错误之处.
http://www.acejoy.com/bbs/dispbbs.asp?boardid=14&id=51完成端口的核心是异步调用,你投递的操作会进入操作系统的队列中并立刻返回,然后你的程序可以去处理其它的任务,而你设置的工作者线程会调用GetQueuedCompletionStatus等待操作系统的处理结果,成功、失败、异步操作进程?
更细致的处理过程,请看代码。