yuyunliuhen

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  3 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

常用链接

留言簿

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

2011年11月23日 #

   现在的游戏一般单线程已不够满足需求,若采用多线程管理,如何设计比较合理呢?
   考虑方案:主线程 + N线程(一个地图一个线程,也可以根据地图占用资源来分配)
   那么,各个线程之间又该如何协作呢?
   1 每个线程2个消息队列,如一个负责读,一个负责写,主线程对各个线程进行轮询读,需求时写。
   2 每个线程一个网络连接,可以看做一个单独的“进程”,主线程负责共享数据的加载以及线程的调度,监控。
posted @ 2011-11-23 14:23 CleanSky 阅读(306) | 评论 (0)编辑 收藏

2010年3月20日 #

 

HANDLE WINAPI CreateIoCompletionPort(
  __in          HANDLE FileHandle,
  __in          HANDLE ExistingCompletionPort,
  __in          ULONG_PTR CompletionKey,
  __in          DWORD NumberOfConcurrentThreads
);
一个I/O完成端口关联一个或多个文件句柄,也可以在创建I/O完成端口的时候没有关联任何文件句柄。
一个I/O完成端口关联一个打开文件的实例使应用程序可以收到包括这个文件异步I/O操作的完成通知。

参数:
FileHandle 打开重叠IO完成端口的文件句柄
如果设置这个参数为INVALID_HANDLE_VALUE,那么,CreateIoCompletionPort 会创建一个不关联任何文件的完成端口,而且ExistingCompletionPort 必须设置为NULL,CompletionKey 也将被忽略。

ExistingCompletionPort  完成端口句柄
如果指定一个已经存在的完成端口,函数将关联FileHandle 指定的文件,并返回已存在的完成端口句柄,函数不会创建一个新的完成端口。
如果这个参数为NULL,函数创建一个与FileHandle指定的文件关联的完成端口,并返回一个新的完成端口句柄。

CompletionKey 单文件句柄,包含指定文件每次IO完成包数据信息。

NumberOfConcurrentThreads 系统允许在完成端口上并发处理IO完成包的最大线程数量。
如果ExistingCompletionPort 为NULL,此参数忽略

返回值:
如果执行成功,函数返回关联指定文件的完成端口句柄;否则,返回NULL

备注:
CreateIoCompletionPort 提供这个功能:I/O系统可以被用来向列队的I/O完成端口发送I/O完成通知包。
当你执行一个已经关联一个完成端口的文件I/O操作,I/O系统将会在这个I/O操作完成的时候向I/O完成端口发送一个完成通知包,I/O完成端口将以先进先出的方式放置这个I/O完成通知包,并使用GetQueuedCompletionStatus 接收I/O完成通知包。
虽然允许任何数量的线程来调用GetQueuedCompletionStatus 等待一个I/O完成端口,但每个线程只能同时间内关联一个I/O完成端口,且此端口是线程最后检查的那个端口。
当一个包被放入队列中,系统首先会检查有多少个关联此端口的线程在运行,如果运行的线程的数量少于NumberOfConcurrentThreads的值,
那么允许其中的一个等待线程去处理包。当一个运行的线程完成处理,将再次调用GetQueuedCompletionStatus ,此时系统允许另一个等待线程去处理包。
系统也允许一个等待的线程处理包如果运行的线程进入任何形式的等待状态,当这个线程从等待状态进入运行状态,可能会有一个很短的时期活动线程的数量会超过NumberOfConcurrentThreads 的值,此时,系统会通过不允许任何新的活动线程快速的减少线程个数,直到活动线程少于NumberOfConcurrentThreads 的值。

posted @ 2010-03-20 17:57 CleanSky 阅读(2375) | 评论 (0)编辑 收藏

     摘要:   阅读全文
posted @ 2010-03-20 17:48 CleanSky 阅读(1177) | 评论 (0)编辑 收藏