熊币充值(所得用于论坛建设)
发新话题
打印

IOCP问题

IOCP问题

一直想写IOCP的完成端口远控,但是工程量太大,虽然脑子中基本有了构思,但是没有心思去写
太累人了,天天忙着看孩子

TOP

小熊又开始吹水了~
IOCP就那三个函数。。。小孩子都会写的
小熊捣鼓这个有点过时了
不如想想如何处理线程池吧~

TOP

是啊
标题:IOCP模型[From Sandy]
出处:服务器开发
时间:Tue, 28 Nov 2006 00:00:44 +0000
作者:huzhangyou2002
地址:http://www.libing.net.cn/read.php/798.htm

内容:
代码是D的,相信不难,作者也是别人摘过来的!

摘自nonocast的《理解I/O Completion Port》

先看一下IOCP模型的实现:

//创建一个完成端口
FCompletPort := CreateIoCompletionPort( INVALID_HANDLE_VALUE, 0,0,0 );

//接受远程连接,并把这个连接的socket句柄绑定到刚才创建的IOCP上
AConnect := accept( FListenSock, addr, len);
CreateIoCompletionPort( AConnect, FCompletPort, nil, 0 );

//创建CPU数*2 + 2个线程
for i:=1 to si.dwNumberOfProcessors*2+2 do
begin
AThread := TRecvSendThread.Create( false );
AThread.CompletPort := FCompletPort;//告诉这个线程,你要去这个IOCP去访问数据
end;

OK,就这么简单,我们要做的就是建立一个IOCP,把远程连接的socket句柄绑定到刚才创建的IOCP上,最后创建n个线程,并告诉这n个线程到这个IOCP上去访问数据就可以了。

再看一下TRecvSendThread线程都干些什么:

procedure TRecvSendThread.Execute;
var
......
begin
while (not self.Terminated) do
begin
//查询IOCP状态(数据读写操作是否完成)
GetQueuedCompletionStatus( CompletPort, BytesTransd, CompletKey, POVERLAPPED(pPerIoDat), TIME_OUT );

if BytesTransd 0 then
  ....;//数据读写操作完成

//再投递一个读数据请求
WSARecv( CompletKey, @(pPerIoDat^.BufData), 1, BytesRecv, Flags, @(pPerIoDat^.Overlap), nil );
end;
end;

读写线程只是简单地检查IOCP是否完成了我们投递的读写操作,如果完成了则再投递一个新的读写请求。
应该注意到,我们创建的所有TRecvSendThread都在访问同一个IOCP(因为我们只创建了一个IOCP),并且我们没有使用临界区!难道不会产生冲突吗?不用考虑同步问题吗?
呵呵,这正是IOCP的奥妙所在。IOCP不是一个普通的对象,不需要考虑线程安全问题。它会自动调配访问它的线程:如果某个socket上有一个线程A正在访问,那么线程B的访问请求会被分配到另外一个socket。这一切都是由系统自动调配的,我们无需过问。




Generated by Bo-blog 2.0.3 sp1
这就是IOCP的核心,也就是零说的三个东西,呵呵
不过玩起来老出毛病,我程序现在归根到底确实是线程池问题

TOP

等下
看孩子 [s:80] [s:80] [s:80] [s:80]
熊哥好伟大啊
还要看孩子 做兼职保姆吗?

TOP

发新话题