找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4472|回复: 2

第一册书上Message_Queue例子的一个问题

[复制链接]
发表于 2009-10-23 17:34:09 | 显示全部楼层 |阅读模式
在10.5 The ACE Semaphore Classes一节的Example部分
书上例子给DEFAULT_LWM的默认值为0,是有问题的,会严重降低性能,这个值应该接近(<=)DEFAULT_HWM。
实际的Message_Queue.h代码为:
class ACE_Export ACE_Message_Queue_Base
{
public:
  enum
  {
    // Default high and low watermarks.
    /// Default high watermark (16 K).
    DEFAULT_HWM = 16 * 1024,
    /// Default low watermark (same as high water mark).
    DEFAULT_LWM = 16 * 1024,
............
发表于 2009-11-21 14:58:32 | 显示全部楼层

对于水位的理解

为了保证队列的出队和入队都十分顺畅,
一般我都把高水位设为一个大的值,比如1024*1024*5,也就是5M,原则是远远大于数据流的进入。
然后把低水位设为一个极小的值,要小于你的单个数据包大小,否则就会导致一些数据的残留和被延时出队。这在大量实时数据的传输至关重要。
或者把低水位设为0,也就是只有队列真的空时才堵塞出队线程。

这是我的一些经验。呵呵。所以说上面的例子基本谈不上错误。

[ 本帖最后由 shenming 于 2009-11-21 15:12 编辑 ]
 楼主| 发表于 2009-11-21 17:37:00 | 显示全部楼层
当时发帖的时候懒了点,嫌解释麻烦就直接引用了ace的实际代码
原因在书上例子的最后几句代码里

  // Only signal if we've fallen below the low water mark.
  if (cur_bytes_ <= low_water_mark_ && enqueue_waiters_ > 0) {
    enqueue_waiters_--;
    notfull_.release ();
  }

这时waiters会等的花儿也谢了
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-3-29 21:31 , Processed in 0.013676 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表