第一册书上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,
............
对于水位的理解
为了保证队列的出队和入队都十分顺畅,一般我都把高水位设为一个大的值,比如1024*1024*5,也就是5M,原则是远远大于数据流的进入。
然后把低水位设为一个极小的值,要小于你的单个数据包大小,否则就会导致一些数据的残留和被延时出队。这在大量实时数据的传输至关重要。
或者把低水位设为0,也就是只有队列真的空时才堵塞出队线程。
这是我的一些经验。呵呵。所以说上面的例子基本谈不上错误。
[ 本帖最后由 shenming 于 2009-11-21 15:12 编辑 ] 当时发帖的时候懒了点,嫌解释麻烦就直接引用了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]