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及相关数据的代码:

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

注意:用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

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

  1. ACE中TASK架构简介及简单应用

    一.基础功能介绍 1.ACE_Message_Block*,Windows消息用MSG结构表示,ACE_Task中因为不能预计各种应用中消息的类型,所以ACE_Message_Block基本上可以理解 ...

  2. ACE - ACE_Task源码剖析及线程池实现

    原文出自http://www.cnblogs.com/binchen-china,禁止转载. 上篇提到用Reactor模式,利用I/O复用,获得Socket数据并且实现I/O层单线程并发,和dispa ...

  3. 使用ACE_Task管理线程

    为什么要使用ACE_Task来管理线程 从C#转到C++后,感觉到C++比C#最难的地方,就是在系统编程时,C#中有对应的类库,我接触到一个类后,就可以通过这个类,知道很多相关的功能.而在C++中,必 ...

  4. ACE线程管理机制-面向对象的线程类ACE_Task

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/05/583231.html 我们在前一章中使用ACE_Thread包装时,你一定已经注意到了一 ...

  5. ACE - Reactor源码总结整理

    ACE源码约10万行,是c++中非常大的一个网络编程代码库,包含了网络编程的边边角角. ACE代码可以分三个层次:OS层.OO层和框架层: OS层主要是为了兼容各个平台,将网络底层API统一化,这一层 ...

  6. 【转】ACE编程小结

    转自:http://blog.csdn.net/mjp_mjp/article/details/4406059 1.多线程中的ACE_Reactor::EventLoop,当在多线程(池)中调用Eve ...

  7. 利用ACE 自己实现的线程池

    1: 线程池组件的配置文件: [log] ;DEBUG = 0 ;INFO = 1 ;WARN = 2 ;FAULT = 3 level=0 ;SCREENOUT = 0 ;FILEOUT = 1 ; ...

  8. ACE-Streams架构简介及应用

    一概述 Streams框架是管道和过滤构架模式的一种实现,主要应用于处理数据流的系统.其实现以Task框架为基础.Task框架有两个特性非常适用于Streams框架:一是Task框架可用于创建独立线程 ...

  9. ACE消息队列(转)

    1    消息队列 ACE消息队列由三个部分组成:消息队列(ACE_Message_Queue).消息块(ACE_Message_Block).数据块(ACE_Data_Block) 1.1    A ...

随机推荐

  1. 大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值

    第八章 面向对象编程-高级8.1 静态属性和静态方法8.1.1 静态属性-提出问题8.1.2 基本介绍8.1.3 伴生对象的快速入门8.1.4 伴生对象的小结8.1.5 最佳实践-使用伴生对象解决小孩 ...

  2. NOI 1.5编程基础之循环控制 44:第n小的质数

    描述 输入一个正整数n,求第n小的质数. 输入 一个不超过10000的正整数n. 输出 第n小的质数. 样例输入 10 样例输出 29

  3. hihocoder1067 最近公共祖先·二(tarjin算法)(并查集)

    #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站 ...

  4. Linux命令之dd

    dd [OPERAND] dd 选项 复制一个文件,根据[OPERAND]进行转换和格式化 (1). OPERAND参数 说明1:dd的选项只有’--help’和’--version’,也就是帮助与版 ...

  5. Servlet 3.1 规范

    在线版目录 Servlet3.1规范翻译——前言 Servlet3.1规范翻译——概览 Servlet3.1规范翻译——Servlet Context Servlet3.1规范翻译——Response ...

  6. 【spfa】bzoj1295 [SCOI2009]最长距离

    题意:给你一个n*m的点阵.有些点是障碍,求一个欧几里得距离最大的点对(A,B),使得在移走的障碍≤T的情况下,可以从A走到B. 建图,跑n*m次spfa,求出从 每个点 出发到 其他所有点 的 经过 ...

  7. python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)

    ''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_ ...

  8. redis系列文章

    http://blog.csdn.net/liubenlong007/article/details/53690103

  9. Git学习笔记(一) 安装及版本库介绍

    安装Git 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和 ...

  10. 使用CSS实现自定义input[checkbox]样式

    思路:使用label上的for熟悉,与checkbox上的id相对应来达到点击选中效果,在使用伪元素,或者其他元素,定位至checkbox上方,替代checkbox,并且隐藏checkbox,使用CS ...