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

ACE_Task::putq(转)相关推荐

  1. MapGuide源码分析----MapGuide服务器源码分析

    同样,在介绍MapGuide 服务器如何处理枚举资源操作之前,让我们首先来看看MapGuide 服务器用于处理服务请求和操作的类,图19‑9显示服务请求处理器类的类图,图19‑10显示了操作处理器类的 ...

  2. 我在Salira的800天(2009.5.20~2011.7.29)

     我在Salira的800天(2009.5.20~2011.7.29) 一.感谢篇 Content 零.序 一.感谢篇 1. Salira 2. L 3. J 二.工作篇 三.研究与学习篇 四.总结篇 ...

  3. ACE_Task介绍

    ACE_Task 是ACE 中的任务或主动对象"处理结构"的基类.在ACE 中使用了此类来实现主动对象模式.所有希望成为"主动对象"的对象都必须从此类派生.你也 ...

  4. ACE_Message_QueueACE_MT_SYNCH::putq ()使用时需要注意的地方

    函数声明 template<ACE_SYNCH_DECL > int ACE_Task< ACE_SYNCH_DECL >::putq ( ACE_Message_Block ...

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

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

  6. ACE的接受器(Acceptor)和连接器(Connector):连接建立模式

    接受器 / 连接器模式设计用于降低连接建立与连接建立后所执行的服务之间的耦合.例如,在 WWW 浏览器中,所执行的服务或"实际工作"是解析和显示客户浏览器接收到的 HTML 页面. ...

  7. ACE_Proactor网络通信示例

    注:本文仅对使用ACE进行网络通信进行演示说明.本文中的代码皆使用doxgen的注释风格.本文中使用的事件机制,其原理与实现请参考[ 基于C++的事件机制设计[2.0]]一文. ACE的Proacto ...

  8. ACE入门---很好的文章

    转自:http://www.cnblogs.com/dubingsky/archive/2009/07/22/1528292.html ACE编译 1. 设置环境变量 在操作系统添加一个名为ACE_R ...

  9. ACE之Proactor模式使用实例

    // ACE_Proactor_Client.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"#include "ace/Messag ...

最新文章

  1. jupyter的下载安装
  2. WDS Services Can't Start
  3. 面试官:你们Redis故障过吗,怎么解决?
  4. spring中这些能升华代码的技巧,可能会让你爱不释手
  5. 职业生涯中12个愚蠢想法
  6. boost::geometry::model::segment用法的测试程序
  7. OpenCV模板匹配Template Matching
  8. 切割固定长度字符串的方法_木质踢脚线安装的施工方法
  9. ASP.NET Core端点路由中三种让人困惑的路由函数
  10. hashcode是什么意思_什么才是 Java 的基础知识?
  11. macOS Unlocker3.0
  12. (18)System Verilog禁止约束语句
  13. ios 控件切圆_iOS中 切圆角,任意几个角(带边框,不带边框)__OC和Swift版本 韩俊强的博客...
  14. 联网玩具CloudPets 泰迪熊泄漏数百万语音信息
  15. 苹果客服说的「重置SMC、NVRAM、PRAM」都是干嘛的?
  16. 我的世界漆黑一片 看不见明天
  17. 数据分析09|数据转换
  18. vue用html方式路由守卫,vue-router 实现导航守卫(路由卫士)的实例代码
  19. win10笔记本插上耳机没声音设置
  20. 蒲公英服务器搭建小程序,uniapp 小程序打包发布

热门文章

  1. scala array 删除元素_Array中some介绍
  2. 250鲁大师跑分_看了鲁大师跑分,会发现MX250独显笔记本已落伍了
  3. 微信小程序打开红包的css_山海经攻略(微信小程序现金红包提现游戏)
  4. linux使用shell函数扩充命令,Linux Shell系列教程之(十五) Shell函数简介 | Linux大学...
  5. python中的排序方法都有哪些_几种常见的排序方法总结(Python)
  6. 核试验计算机模拟,随着信息技术的发展,包括核试验在内的许多科学研究都可以用计算机模拟...
  7. AI Studio 不同环境下的执行速度
  8. 为什么在MM32中的MicroPython中无法打开二进制文件呢?
  9. 这些焊接缺陷,你遇到过多少?
  10. WS2812串行可控彩色LED灯珠