一动不如一静

C++博客 首页 新随笔 联系 聚合 管理
  20 Posts :: 0 Stories :: 10 Comments :: 0 Trackbacks
       ACE_WFMO_Reactor允许多个线程并发的调用handle_events(),这个能力的增加使得它的设计变的复杂,并且引入了一些同基于select的反应器不同的地方.不同点如下:
  • 注册改变的协调.已注册句柄集合的每一个改变,将会影响到所有执行事件循环的线程.在没有同步的情况下允许这些改变的发生,会导致丢失事件,或不正确,不合法的句柄被分发.为了在多线程的情况下,正确的处理注册发生改变的情况,ACE_WFMO_Reactor维持了三个句柄信息集合对象.
  1. 用作事件侦查和分发的当前句柄
  2. 新句柄, 除了当前句柄集合,新句柄也在等待
  3. 挂起句柄,是当前句柄中挂起的句柄
当需要改变已注册的句柄时,(例如:注册,移除,挂起和恢复一个事件处理器),要记住句柄,事件处理器,事件类型信息,和相关信息的记录.下一个完成handle_events的线程会注意到这个改变,获取reactor的锁,等待所有其他正在运行handle_events的线程完成.为了能让这些线程及时的完成,等待的线程发送一个内部事件,该内部事件是分发句柄集合的一部分.唤醒所有阻塞在WaitForMultipleObjects的线程.这个时候,所有的事件处理线程将会阻塞在等待变化的发生.当原始的线程完成必要的信息和句柄改变后,释放reactor的锁.所有的事件处理线程重新开始在更新后的句柄集合上进行等待,分离和分发.
  • 推迟事件处理器的清除.ACE_WFMO_Reactor注册改变的延迟引入了一些与基于select()的反应器的不同之处.当hanle_*()方法返回-1或者ACE_Reactor::remove_handler()被事件处理器调用时,它推迟事件处理器的移除和handle_close()钩子函数的回调,直到上面说讲的注册改变发生.所以一个应用在请求ACE_WFMO_Reactor移除一个事件处理器之后,不能立即删除该事件处理器,否则reator后来调用的handle_close()方法会分发一个无效的指针.
posted on 2006-06-23 20:48 一动不如一静 阅读(784) 评论(0)  编辑 收藏 引用 所属分类: ACE

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理