ACE 问题探讨
来源:互联网 发布:apache缓存 编辑:程序博客网 时间:2024/04/28 03:57
1关于在不同线程当中启用run_event_loop()的问题,调用线程必须在调用该函数之前使用ACE_Reactor::instance()->owner(ACE_Thread::self());来获得当前线程的控制权限才能继续的进行事件分发。用TP_Reactor不会有此问题。
2停止事件循环的问题。
while (bStart)
{
iEvent = ACE_Reactor::instance()->handle_events();
}
我们需要手动给ACE_Reactor::instance()->handle_events();
加一个循环,否则,此函数只进行一次分发就会返回。主意此函数可以设置阻塞时间,如果不设置默认为永远阻塞,所以如果你希望让此函数返回的时候需要从你的ACE_Event_HandlerD队列中移除一个对象比如使用ACE_Reactor::instance()->remove_handler,这样就可以使ACE_Reactor::instance()->handle_events();返回。
3考虑不周的Reactor Notify机制
这也应该是一个BUG,Reactor Notify的代码有考虑不周的地方。Notify机制的本质是提供了一条消息队列让大家有方法调用Event_handler,但是存在一种可能,在你的通知消息在消息队列的时候,Event_hanlder由于后面的处理可能已经handle_close了。但是ACE的dispatch_notify却没有考虑倒这一点(或者说考虑倒这一点也不好解决)。
ACE_Select_Reactor_Notify::dispatch_notify函数的代码。
int
ACE_Select_Reactor_Notify::dispatch_notify (ACE_Notification_Buffer &buffer)
{
ACE_Event_Handler *event_handler =
buffer.eh_;
bool const requires_reference_counting =
event_handler->reference_counting_policy ().value () ==
ACE_Event_Handler::Reference_Counting_Policy::ENABLED;
//如果此时这个ACE_Event_Handler已经被handle_close了,也就时删除了此对象,狠容易引起崩溃。
switch (buffer.mask_)
{
case ACE_Event_Handler::READ_MASK:
case ACE_Event_Handler::ACCEPT_MASK:
result = event_handler->handle_input (ACE_INVALID_HANDLE);
这个bug到5.6.1还没有解决。我觉得这个问题是可以解决的,ACE自己再其中可以提供一个删除对象的方法,并在这个方法中进行同步和错误的判断。
而我现在的做法是设置一个TIMER 让ACE去调用汉handle_timeout的时候再来删除所注册的对象。
4 ACE ACE_Reactor::instance()->schedule_timer(this, 0,
ACE_Time_Value(1)); 如果修改系统时间,比如向前调一段时间,TIMER的触发时按照设置时间的时间点往后加一段时间,所以如果设置1分钟后触发,但此时修改了系统时间向前调了1分钟,这样只有CPU时间的两分钟后才会触发。但如果系统时间向后调,则不会发生影响。
- ACE 问题探讨
- ACE菜鸟的问题
- 碰上一个ACE问题
- ACE编译问题
- ACE问题总结
- ACE编程遇到的问题
- 使用ACE注意的问题
- 关于ACE的日志问题
- ACE 6.1.2 编译问题
- ACE配置及问题总结
- 内存泄漏问题探讨
- 探讨找工作问题
- 日食问题再探讨
- 汉诺塔问题简单探讨
- Excel速度问题探讨.
- 面对‘骑驴看马’问题探讨
- 探讨笨蛋问题!!!
- 网站并发问题探讨
- 转 TCP/IP三次握手过程
- SEO完全手册之关键词选取
- 关于TCP连接的步骤
- 共享内存
- (转)打开FTP服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹
- ACE 问题探讨
- 进程和线程的异同点
- 简易徒手操 白领男士减肥法
- [转载]我们是如何对一个网站进行优化的
- iPhone数据库结构
- 繁体与简体的转换(C++实现)
- 尊敬的XX先生!
- 类成员的可见性
- 人体24小时使用指南