IOCP服务器目前感觉遇到二个瓶颈?

wapjia43106140 2012-06-28 01:44:30
我写了一个IOCP服务器目前感觉遇到二个瓶井.
我的思想大致如下,IOCP收数据这块与一般模型没有区别. 我只是把数据处理这块单独开了几个数据处理线程.
1.主要收到数据后,我客记A数据(假如句柄是5656))放到另外数据处理线程处理,然后再通过5656句柄把处理的处理返回客户端.
但是如果A处理时间有点长.那IOCP那边A的SOCKET(5656)关闭. 此时有另外一个客户连B上来句柄也为(5656).A这边还没有处理,此时再发送5656的句柄不就是把A的数据给B发啦嘛.
不知道有没有关闭SOCET让他不重用的方法?
2.我现在发现这种在另外开几个数据线程处理数理,感觉要互斥同步,是不效率反而不高??????????(其它一般都是ECHO这种处理方法).例如我要把数据投放到这边数据处理线程来,要互斥,断开连接,等一般的数据处理都要互斥这样感觉就像单线程处理数据啦.

不知道大家对这个怎么看?
...全文
219 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yitang2003 2012-06-30
  • 打赏
  • 举报
回复
服务端关闭了(主动关闭),A应该收到通知,此时及时处理完成了,也不能发送了
hurryboylqs 2012-06-29
  • 打赏
  • 举报
回复
你把客户端连接包装称一个对象,IOCP通知处理模块就通过这个对象指针来识别即可,有困难吗?不要用SOCKET句柄来辨别啊
wapjia43106140 2012-06-29
  • 打赏
  • 举报
回复
楼上.我是在另外一个线程处理数据,不是在IOCP里面.万一数据处理线程速度慢,卡在那儿,你不可能因为这边不让IOCP这边关闭SOCKET吧.
我相当于IOCP与线程处理是二个模块,互不相干,IOCP断开的时候通知处理线程有SOCKET要断啦.
stjay 2012-06-29
  • 打赏
  • 举报
回复
1.A数据没处理完之前不要closesocket A
那后面的socket的值就不会重复

2.一般采用PerHandleData引用计数,
使用的是原子锁(InterLockedXXX),
类似智能指针
(注意PerHandleData分配好后,即第一次使用时,计数是不为0的)
把数据投放到线程前,计数加1,
处理完后减1,检查计数是否为0,释放PerHandleData(包括closesocket)
断开连接时,计数减1,检查是否为0,释放。
这比用互斥同步高效的多,对整体性能影响也不大
wapjia43106140 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
一、SOCKET 与ID映射。
二、加锁的确是服务器最大的效率瓶颈之一。但你可以同一时刻只让一个客户端只有一个线程在处理,可以在处理一个完一个请求之前不投递任何IO操作。
[/Quote]

1.我目前的处理方式是加入时间,连接生成一个时间,数据有一个时间,如果数据时间比连接时间早就不处理些 数据.
2.我是把收到的数据专门放到一个队列里面.我从队列取数据来处理,肯定要加锁啊???还有我得处理资源释放也得加锁.我必须保证这个锁是同一个锁,所以这样就低啦.

数据处理线程大致如下:

static UINT WorkerThreadProc(LPVOID pParam)
{

MangerDataContorl* pPoolServer = reinterpret_cast<MangerDataContorl*>(pParam);

while (1)
{
jobItem *pJob = pPoolServer->getJobitem();//取一个数据包
Sleep(2);

if (pJob)
{

ProcessJob(pPoolServer->mCIOCP,pJob);

pPoolServer->mMapClientLock.On();//数据处理锁.//这个锁在增加连接,断开连接,增加数据都加这个锁.所以感觉很多地方互斥
ClientControl *pclient = pJob->parent;
pclient->isDoing =false;//表示该客户端没有其它线程在处理.

if(pclient->isDisConnet ) //断开连接
pPoolServer->clearAllocateClient(pclient);//释放资源
pPoolServer->claerAllocateJobItem(pJob);

pPoolServer->mMapClientLock.Off();
}

}

return 0xdead;
}
hurryboylqs 2012-06-29
  • 打赏
  • 举报
回复
你看下boost asio 在代码里这些问题都给你回答了
zhouzhipen 2012-06-29
  • 打赏
  • 举报
回复
一、SOCKET 与ID映射。
二、加锁的确是服务器最大的效率瓶颈之一。但你可以同一时刻只让一个客户端只有一个线程在处理,可以在处理一个完一个请求之前不投递任何IO操作。
满衣兄 2012-06-29
  • 打赏
  • 举报
回复
我也遇到了同样的问题,我的想法是每个SOCKET分配一个唯一ID

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧