freeeyes 发表于 2010-10-9 09:56:09

如果还有等待发送的数据,会有线程锁保持已经在发送数据的队列被处理。详细可以参照一下connecthandler.cpp里面的断开代码。还有发送队列部分。

wuyudry 发表于 2010-11-1 16:28:13

ProConnectHandle.cpp中的CProConnectHandle::PutSendPacket为什么在发送成功了以后进行m_nIOCount--操作? 投递的这个操作还没返回吧? 应该是在 handle_write_stream的发送成功里面m_nIOCount--吧?
还有,对m_nIOCount的加锁我很不理解,如果只是要锁++,--操作,可以用原子操作ACE_Atomic_Op。
但是假如handle_read_stream来了个断开连接的操作io,刚进函数,这时你调用发送函数PutSendPacket刚m_nIOCount++,release以后,handle_read_stream调用了CProConnectHandle::Close,这不是不会去析构了?

freeeyes 发表于 2010-11-2 10:04:28

1.ProConnectHandle: PutSendPacket()方法在
bool CProConnectHandle::SendMessage(IBuffPacket* pBuffPacket)函数里面被调用,在这里面有一行
        m_ThreadWriteLock.acquire();
        m_nIOCount++;
        m_ThreadWriteLock.release();
这里进行了一次++操作。
你说的handle_write_stream()操作,我最早是这么写的,但是当发送出现拔出网线的情况时,handle_write_stream()函数是不会被proactor反应器调用,除非链接被系统确认完全断开才可以,这种情况下容易造成数据大量的堆积,为了解决这个问题,我把--操作放在了put中,意思就是当数据被放入系统队列成功我就认为这次IO完成了。
2.不会被析构,因为我会在Close里面判定是否还有当前才做,当所有的对这个类的当前操作结束的时候,才会最后析构这个类。有人建议我使用智能指针,我最后还是想用简单的计数器去实现。关于原子的ACE_Atomic_Op,我不知道在多线程下这个类是否稳定,而且就扩展性而言,在有些linux环境下原子操作会在gcc中获得警告,为了避免这些情况,我决定使用最简单的方法。
欢迎提问,呵呵。

wuyudry 发表于 2010-11-2 12:14:37

对于第二个问题,你可能理解错了。 我意思是你只锁了计数count,如果多线程下,是否存在,本来你进到CProConnectHandle::Close判断count是否为0的之前,CProConnectHandle::SendMessage那里正好++了,然后让你没删掉这个对象?

freeeyes 发表于 2010-11-2 18:44:57

你可以测试一下这种群概况,我测试过,似乎没有遇到问题。

nono436 发表于 2010-11-11 21:14:26

楼主你这个代码,接受2000连接大约需要多少时间?

freeeyes 发表于 2010-11-12 09:44:43

你用我的测试程序自己跑一下就知道了

res100 发表于 2010-11-12 10:43:34

ConnectServer.conf 具体起到什么作用可以介绍一下吗 ,我把ServerCount=1后,怎么就报错了,要如何设置,请楼主赐教!

freeeyes 发表于 2010-11-12 11:40:05

这个部分是链接中间服务器的,你必须设置一个已存在的中间服务器地址,你可以设置多个链接,链接个数就是ServerCount,服务器启动后会根据这个配置文件。建立若干个长连接。
这部分我正在重做,服务器间传输是要尽量做到通用有些难度。
最近忙于游戏开发,一直没时间整理这块。想等过两周,和stone,winston以及modern一起商讨一下顶一个服务期间数据传输标准后,将这部分替换掉。
如果你想使用是可以的,不过建议再等等我把这部分完善后。
如果很急,也可以自己实现一个在so中,不用我这个服务期间传输即可。

dbaicai 发表于 2010-11-15 15:20:07

挺好的,谢谢分享
页: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17
查看完整版本: ACE开源服务器研究(SVN和git版本持续更新中)