ACE_Task::putq(转)

int ACE_Task< ACE_SYNCH_DECL >::putq (     ACE_Message_Block * , ACE_Time_Value *     timeout = 0    )

提供了一个向线程中提交数据的方法

它是通过将提交数据插入到线程的消息队列来(msg_queue)完成这个操作的,我起初认为这个方法是完全异步的,也就是说调用时不会阻塞,但最近在使用线程池时,发现,如果msg_queue已满,则会阻塞,阻塞时时间长度,由putq的第二个参数来决定。
调用putq时,向msg_queue添加数据(enqueue_tail),而在线程中,getq时,从队列中弹出(dequeue_head),每次 调用enqueue_tail时,msg_queue都方法:is_full_i()来判断队列是否已满,在is_full_i()中,是通过判断队列中 所有数据块的总长度来确定是否已满的,而不是通过数据块个数:this->cur_bytes_ >= this->high_water_mark_

以下为putq及相关数据的代码:

1 template <ACE_SYNCH_DECL> ACE_INLINE int
2 ACE_Task<ACE_SYNCH_USE>::putq (ACE_Message_Block *mb, ACE_Time_Value *tv)
3 {
4 ACE_TRACE ("ACE_Task<ACE_SYNCH_USE>::putq");
5 return this->msg_queue_->enqueue_tail (mb, tv); //直接添加到队列
6 }
 1 template <ACE_SYNCH_DECL> int
 2 ACE_Message_Queue<ACE_SYNCH_USE>::enqueue_tail (ACE_Message_Block *new_item,
 3                                               ACE_Time_Value *timeout)
 4 {
 5    ...
 6
 7     if (this->wait_not_full_cond (ace_mon, timeout) == -1) //检测并确保队列未满
 8       return -1;
 9
10     queue_count = this->enqueue_tail_i (new_item); //添加新数据块
11 ...
12
13 }
 1 template <ACE_SYNCH_DECL> int
 2 ACE_Message_Queue<ACE_SYNCH_USE>::wait_not_full_cond (ACE_Guard<ACE_SYNCH_MUTEX_T> &,
 3                                                       ACE_Time_Value *timeout)
 4 {
 5 ...
 6 while (this->is_full_i ()) //决断队列是否已满
 7     {
 8       if (this->not_full_cond_.wait (timeout) == -1) //等侍队列有数据块弹出
 9         {
10 ...
11         }
12 ...
13     }
14 ...
15 }
1 template <ACE_SYNCH_DECL> int
2 ACE_Message_Queue<ACE_SYNCH_USE>::is_full_i (void)
3 {
4 ACE_TRACE ("ACE_Message_Queue<ACE_SYNCH_USE>::is_full_i");
5 return this->cur_bytes_ >= this->high_water_mark_; //cur_bytes的值在是所有数据块长度的和, high_water_mark_的默认值为:0x4000,可以在能过方法high_water_mark()来修改,在 ACE_Message_Queue::open时,可以通过参数指定.
6 }

注意:用putq压入一个ACE_Message_Block时,如果被putq 的是指针blk,则不能轻易release这个指针。因为putq的仅是这个指针而非指针所指内存,release指针所指内存后 ACE_Message_Queue将会出错;如果被putq的是指针blk的blk->clone(),则后面可以 blk->release()。

原文:http://hi.baidu.com/hardcorn/blog/item/d31d2d34c8af553c5bb5f517.html

时间: 2024-10-26 03:32:58

ACE_Task::putq(转)的相关文章

【转】ACE编程小结

转自:http://blog.csdn.net/mjp_mjp/article/details/4406059 1.多线程中的ACE_Reactor::EventLoop,当在多线程(池)中调用EventLoop时,需要注意,在Acceptor/EventHandler中要使用其中的方法Reactor()来获取ACE_Reactor的指针,不要使用ACE_Reactor::instance,道理很简单哟.不过,一定要注意,在编程时,使用Reactor()类方法,比使用单件的方法要好很多,起码安全

ACE_Message_Block实现浅析

ACE_Message_Block实现浅析1. 概述ACE_Message_Block是ACE中很重要的一个类,和ACE框架中的重要模式的实现 如ACE_Reactor, ACE_Proactor, ACE_Stream, ACE_Task都有紧密的联系. 换个角度看,ACE_Message_Block实际上已经是这些实现中的重要组成部分.抛开和框架的配合不谈, ACE_Message_Block本身也相当有用,功能强大,用途广泛.ACE_Message_Block的实现中使用了很多技巧和模式,

apple平台下的objc的GCD,多线程编程就是优雅自然。

在apple的操作系统平台里,GCD使得多线程编程是那么的优雅自然.在传统的多线程编程中,首先要写线程处理循环:之后还有事件队列,消息队列:还要在线程循环中分离事件解释消息,分派处理:还要考虑线程间是否要同步:还要写许多有着可能费解的函数名的回调处理程序,注册回调程序,而且代码分散即使同一文件也不容易看出与哪些线程对应或者彼此间的是否有次序或并发的关系,不利于调试:另外还要考虑是否需要使用线程池,线程线使用何种模式等.在apple平台的objc中,只需要如下: A* a; dispatch_as

ACE_Reactor的notify阻塞问题

今天听到一种说法: ACE_Reactor的notify可能会发生阻塞.windwos与linux的消息队列满了之后默认会阻塞掉.linux可以设置成异步的,但是notify队列满了之后,无论异步还是阻塞,新来的信号都会被丢失. 信号队列长度,linux下与文件句柄数一样. 今天再windwos上测试,当信号多余1023个时,notify就会阻塞. linux下待测试…… windows测试部分代码: // t4l.cpp : Defines the entry point for the co

流媒体学习四------- ortp队列的实现

在ortp中实现了一个通用的队列,每一个队列包括三个实体,分别是队列.消息块和数据块,这三个实体分别对应queue_t.msgb和datab结构体. queue_t的定义如下所示: typedef struct _queue { mblk_t _q_stopper;      /* 消息队列头 */ int q_mcount;           /*number of packet in the q */ } queue_t; _q_stopper:消息块,内嵌于queue_t,它的主要作用是

图解VC++6.0和ACE 5.4 开发入门

一 工具和下载 工具和环境: Win7, VC++6, ACE5.4 可在Win7下运行的VC6下载: http://blog.csdn.net/bcbobo21cn/article/details/44200205 ACE安装包和本文demo代码下载: http://pan.baidu.com/s/1kUUOOlh 注意有两个ace安装包,5.4是dsw的工程,6.3是sln的工程 二 安装环境 下载ace54,解压: 在vc6.0中打开ace源码: 2个工程:网上资料有说3个工程: 在工程中

LF模式解决的问题

一说起Leader/Followers并发模式,都会与Half-Async/Half-Sync并发模式进行比较,说LF模式更加高性能,成了一个高性能名词标签 符号,相反HA/HS仿佛成了一个低性能的名词标签,如果你的线程池不使用LF模式就谈论不上高效,要是你还在使用HA/HS模式,马上笼 统地建议换成LF模式,一切的问题会归根于HA/HS模式.那么为什么LF模式没有成一个标准的默认的并发模式呢,彻底取代其它并发模 式呢.因为Leader/Followers并发模式是设计用来解决Half-Asyn

ACE_Svc_Handler 通信原理

ACE作为通讯方面的开源架构,不但用c++实现,而且用JAVA实作的架构已经可以使用了,由此看来掌握ACE成为每歌开发通讯程序的程序员的必备技能. ACE的库分为4个层次: OS适配层该层将ACE的较高层和与OS机制相关联的平台特有的依赖屏蔽开来. OO包装层封装并增强在像Win32和UNIX这样的现代操作系统上可用的并发.进程间通信(IPC).以及虚拟内存机制.应用可以通过有选择地继承.聚合(aggregating).和/或实例化ACE包装类属来合并和编写这些组件. 框架包括反应器,服务配置器

ACE主动对象模式(1)

转载于:http://www.cnblogs.com/TianFang/archive/2006/12/11/589168.html 主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外一种更为透明的任务间通信方法. 传统上,所有的对象都是被动的代码段,对象中的代码是在对它发出方法调用的线程中执行的,当方法被调用时,调用线程将阻塞,直至调用结束.而主动对象却不一样.这些对象具有自己的命令执行线程,主动对象的方法将在自己的执行线程中执行,不会阻塞调用方法. 例如,设想对象"A&quo