wishel 发表于 2009-10-23 17:34:09

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

在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,
............

shenming 发表于 2009-11-21 14:58:32

对于水位的理解

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

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

[ 本帖最后由 shenming 于 2009-11-21 15:12 编辑 ]

wishel 发表于 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会等的花儿也谢了
页: [1]
查看完整版本: 第一册书上Message_Queue例子的一个问题