使用了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而阻塞
阅读(7733) | 评论(0) | 转发(0) |