找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3797|回复: 3

proactor 半同步半异步问题

[复制链接]
发表于 2009-7-14 10:15:12 | 显示全部楼层 |阅读模式
不知道这样理解半同步半异步是否正确,望斑竹能耐心解释,万分感激!

原本可以用proactor框架接收到一个请求就在主线程里处理请求,分析请求完毕,将发送数据的请求交给OS后就对下一个连接做处理。。。显然这样会让后连接者产生严重的时

延感觉,所以决定服务器端接收到一次连接请求就产生一个线程用来处理这个连接所带来的数据请求等。。。。在这个线程里又有异步发送。。。。这样的话就是同步处理,异

步IO,也就是半同步半异步?

想法是这样的,可实现颇难,在论坛上看到下面的一个帖子,上面写了我想实现的这个功能,可是代码完全编不通。

        http://www.acejoy.com/bbs/viewthread.php?tid=80

        proactor连接数4000+出现拒绝连接的问题


其中主要涉及到同步处理的函数
。。。。。。。。。。。。
class arg_{
public:
    arg_(){
    }
    void*                p_this;
    ACE_Message_Block*    mb;
    size_t                len;

    typedef int (*_fun)(arg_);
    _fun    fun;

    void set_fun(int (*fun)(arg_)){
        this->fun = fun;
    }
    int write_(){
        return fun(*this);
    }
};


。。。。。。。。。。。。
arg_ arg;
        arg.set_fun(init_write_stream);                            //这句话始终编不通,不知道是不是环境问题,我用的是VS2008
        {
        ACE_Guard<ACE_Recursive_Thread_Mutex>    _lock(lock_conns);
        conns::instance()->insert(map_conns::value_type((void*)this, arg));
        }
。。。。。。。。。。。。
logic_thread->putq (recv_data_);
。。。。。。。。。。。。。。。


上面的代码都出自那个帖子。。。。。

不知道哪位高手编写过类似代码,可否指点一二。。
发表于 2009-7-14 13:07:26 | 显示全部楼层
建议楼主先理解一下半同步半异步的概念。
可以参考APG的第16章。
概念弄清楚了,问题就比较好解决了。

如书上所说,基于ACE一般都是结合ACE_Message_Block与ACE_Task
来实现半同步半异步模式的,重用性很好。
 楼主| 发表于 2009-7-15 08:54:11 | 显示全部楼层
APG?是ACE proggrammer's Guide 吗?
 楼主| 发表于 2009-7-15 10:50:15 | 显示全部楼层
哦,看到了,谢谢你的关注!
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-23 00:23 , Processed in 0.016192 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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