ACE_Message_Queue的注意事项:

7942阅读 0评论2010-12-13 foolishx
分类:

使用了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而阻塞
上一篇:想起了以前的一个同事!
下一篇:ACE_Dynamic_Message_Queue