zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    group_concat的长度限制
    mb_strlen默认字符集问题
    &符号导致的一个bug
    python面向对象编程系列
    python基础之面向过程编程系列
    RPA流程自动化
    什么是DevOps?
    ansible详解
    saas和paas的区别
    CPT/cpt接口
  • 原文地址:https://www.cnblogs.com/zl1991/p/7263029.html
Copyright © 2011-2022 走看看