ACE_Task::putq
来源:互联网 发布:即时通讯软件开发方案 编辑:程序博客网 时间:2024/05/22 00:38
原文:http://hi.baidu.com/hardcorn/blog/item/d31d2d34c8af553c5bb5f517.html
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) == -1) //检测并确保队列未满
return -1;
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) == -1) //等侍队列有数据块弹出
{
...
}
...
}
...
}
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时,可以通过参数指定.
}
使用注意事项:
http://blog.csdn.net/hxzb7215191/article/details/800018
http://blog.csdn.net/hxzb7215191/article/details/800018
在使用ACE_Task的时候,可以把这个对象看成一个处理器对象,他有一个消息队列,有一堆的线程在处理这一个消息。所以在应用中使用这个东西的机会特别的多。这次我使用的时候发现一个这样的问题。如果数据的速度太快了的时候将会使调用putq函数调用不成功。
这是一个例子代码,其实每一个Task都聚集了一个msg_queue对象的指针,他有一个参数:high_water_mark,就是说,在这个队列中的每个元素的size之和的最高。他的默认值是1024*16。但是有可能还是被占满了。如果发现putq不成功的时候就要使用这个东西来调整水位了。
int ACE_TMAIN(int, ACE_TCHAR *[])
{
MyTask task;
task.star();
task.msg_queue_->high_water_mark(16385);
ACE_Message_Block *new1=new ACE_Message_Block(16384);
task.putq(new1);
new1=new ACE_Message_Block(1);
ACE_Time_Value tv(0,1000);
if (task.putq(new1,&tv)==-1)
{
cout<<"put时失败"<<endl;
}
getchar();
return 0;
}
0
上一篇:static_cast 与reinterpret_cast
下一篇:Android 打包so动态库文件到APK
相关热门文章
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- ACE_Task::putq
- ACE_Task::putq
- ACE_Task::putq 的使用
- 使用ACE_Task的时候要留意putq函数
- Linux平台调用ACE_Task::putq分析(timeout=0,队列满)
- ACE_Task
- ACE_Task
- ACE_Task
- ACE_Task
- ace_task
- ACE_task
- ACE_Task 理解
- ACE_Task框架
- ACE_Task(任务)
- ACE_Task 理解
- 关于ACE_Task::last_thread()
- ACE_Task Consumer-Producer
- 5.2 ACE_Task(任务)
- 有效运用auto_ptr
- SVN Externals Definitions[类似于软链接的功能]
- Linux创建与解压zip, tar, tar.gz,tar.bz2文件
- Python rabbitmq
- static_cast 与reinterpret_cast
- ACE_Task::putq
- shell删除指定时间之前的文件
- 高并发学习之使用Condition实现三个线程轮转&阻塞缓冲区
- 编写R源代码时中文编码问题简介
- ARP技术介绍
- Android程序员的进阶之路
- eclipse下如何将android项目生成apk
- Android系统中调试动态链接库so文件的步骤
- cocos2dx常见49种Action
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
甘蔗收割机多少钱
大棚甘蔗种植技术
哺乳期能吃甘蔗吗
减肥可以吃甘蔗吗
感冒可以吃甘蔗吗
甘蔗削皮机多少钱一台
甘蔗渣多少钱一吨
甘蔗是酸性还是碱性
甘蔗吃了有什么好处
来月经能吃甘蔗吗
吃甘蔗有什么坏处
咳嗽可以吃甘蔗吗
多吃甘蔗有什么好处
大姨妈能吃甘蔗吗
甘蔗什么时候种植
甘蔗种子价格
拉肚子能吃甘蔗吗
黑皮甘蔗批发
甘蔗多少钱一吨
孕晚期能吃甘蔗吗
吃甘蔗上火吗
甘蔗种植时间
河南甘蔗批发价格
广西甘蔗批发
甘蔗是热性还是凉性
黑皮甘蔗种植技术
甘蔗渣的用途
大型甘蔗收割机
咳嗽能吃甘蔗吗
顾恺之吃甘蔗理论
北方甘蔗种植技术
甘蔗糖蜜价格
甘蔗的栽培技术
煮甘蔗的功效与作用
晚上吃甘蔗会发胖吗
大型甘蔗榨汁机
红糖是甘蔗做的吗
甘蔗种植方法
产妇可以吃甘蔗吗
湖北甘蔗产地
甘蔗吃多了上火吗