找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5492|回复: 8

如何在Proactor中保证同步写

[复制链接]
发表于 2008-7-15 22:54:04 | 显示全部楼层 |阅读模式
请问在用Proactor来实现异步IO之后。
用ACE的框架,如何来保证ACE_Asynch_Write_Stream的同步写?
比如多个线程,都在对同一个连接做异步写操作,每次投递100个字节的写请求,必须保证这100字节写操作全部完成之后,才能让其他线程投递下一次写操作。
是否可用条件变量?大家都是如何做的?
 楼主| 发表于 2008-7-15 22:54:10 | 显示全部楼层
首先我感觉这个模式有些问题 - 一般不需要多个线程,同时写吧。最好做接口上面的统一,在一个地方写。
如果一定要这么做,我觉得可以用序号的方法判定,或者用ACE_Token,令牌操作。
 楼主| 发表于 2008-7-15 22:54:16 | 显示全部楼层
这么多同步要求,多线程的优点也降下来了.

实在要作这样的保证,可以在act参数中,填入一个序号.但act仅用于win32平台.
 楼主| 发表于 2008-7-15 22:54:22 | 显示全部楼层
可能是我没有描述清楚,我不是关心多个线程同时写的同步问题。我所讨论的写同步问题,是指对于一个连接,如何保证,在一个逻辑数据包全部被写完成之后,才投递下一个逻辑数据包的异步写请求?

我这里考虑,逻辑数据包的初始写投递请求,与Proactor的运行(如果一次写完成通知的发送数小于初始投递的请求数,这里会继续投递逻辑数据包的剩余部分,直到计算出这个逻辑数据包被全部发送完)是在不同的线程中处理的。

不管发起初始投递的线程是一个还是多个,总不能,前一个逻辑数据包没有被通知全部写完,就接着投递下一个新的逻辑数据包吧?

我想,是不是被Proactor调用的Service_handler的handle_write_stream在计算出一个逻辑数据包被全部发送完之后,通过条件变量告知发送初始写投递请求的线程,可以发送一个新的逻辑数据包的初始写投递请求了?

这里讨论,只是想交流一下,大家碰到这种异步写请求的投递都是怎么来处理的。
 楼主| 发表于 2008-7-15 22:54:28 | 显示全部楼层
自己完成IOCP,的确会碰见这个问题,因为默认情况下,完成端口会按照先后顺序处理,但是在多线程下,因为线程调度的关系,反而不知道哪个会先完成了,但是,ACE内部自己已经做了这个工作了,可以保证你投递的顺序和完成的顺序是一致的。
 楼主| 发表于 2008-7-15 22:54:34 | 显示全部楼层
可能是吧,我最近的服务,在4个cpu的机器上运行,我开发四个线程运行Proactor事件循环.没遇到LZ说的同步问题.

由于使用了ACE_Stream,Stream启动的时候,要有好些线程来执行模块处理.不过没有消息到来的时候,这些线程乖乖地在休眠.

但总之,要用很多线程.
 楼主| 发表于 2008-7-15 22:54:39 | 显示全部楼层
可以考虑继承ACE_Task,用消息队列缓存,在svc里面write stream
 楼主| 发表于 2008-7-15 22:54:48 | 显示全部楼层
弄个序号,接收端自己排序...要不然就线性的投递..发完一个包在发下一个包...
发表于 2008-8-4 09:25:52 | 显示全部楼层
os的异步io机制应该会保证对同一handle的io是serialized

[ 本帖最后由 wishel 于 2008-8-4 10:55 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 17:12 , Processed in 0.022259 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表