Chinaunix首页 | 论坛 | 博客
  • 博客访问: 114594
  • 博文数量: 16
  • 博客积分: 936
  • 博客等级: 准尉
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 16:16
文章分类

全部博文(16)

文章存档

2015年(2)

2014年(1)

2012年(2)

2011年(2)

2010年(9)

分类:

2010-12-13 17:34:13

使用了ACE的多线程框架,不可避免的要用到ACE_Message_Queue,对于这个由ACE_Message_Block串起来的queue,使用起来方便的很,但是也有很多trap,需要多多了解才行。
下面浅谈一下使用过程中常会遇到的问题:
1、messagequeue 状态:
   1)activate
   2) deactive
   3) pulse
   当一个ACE_Message_Queue处于1和3两种状态时,对Supplier 线程的enqueue_tail等操作都可以正常的完成,但是当ACE_Message_Queue处于2状态时,enqueue及dequeue的相关操作会返回-1,即失败,同时last_errorno is ESHUTDOWN。

涉及到改变ACE_Message_Queue状态的方法:
  1. virtual int deactivate (void) = 0;
此方法被调用时,因调用enqueue_tail()而被阻塞的线程们都被唤醒,直接返回-1,last_errno = ESHUTDOWN
  2. virtual int activate (void) = 0;
此方法被调用时,允许线程们enqueue_tail()或dequeue()等相关操作,但是可能会因msg_queue().full()而被阻塞。
2、设置一个ACE_Message_Queue的high_watermark 和low_watermark
   水位标是用来标识一个message_queue在什么情况下是full,什么情况下是empty的标准。
   enqueue操作会因为high_watermark而阻塞
阅读(7644) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~