agent 发表于 2009-7-14 10:15:12

proactor 半同步半异步问题

不知道这样理解半同步半异步是否正确,望斑竹能耐心解释,万分感激!

原本可以用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_);
。。。。。。。。。。。。。。。


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

不知道哪位高手编写过类似代码,可否指点一二。。

modern 发表于 2009-7-14 13:07:26

建议楼主先理解一下半同步半异步的概念。
可以参考APG的第16章。
概念弄清楚了,问题就比较好解决了。

如书上所说,基于ACE一般都是结合ACE_Message_Block与ACE_Task
来实现半同步半异步模式的,重用性很好。

agent 发表于 2009-7-15 08:54:11

APG?是ACE proggrammer's Guide 吗?

agent 发表于 2009-7-15 10:50:15

哦,看到了,谢谢你的关注!
页: [1]
查看完整版本: proactor 半同步半异步问题