|
楼主 |
发表于 2009-1-6 11:20:23
|
显示全部楼层
class MessageBlock : public ACE_Message_Block
{
public:
MessageBlock(size_t size) : ACE_Message_Block(size) {};
template <class T>
int read_by_type(T& x)
{
return read_data((char*)&x, sizeof(T));
};
template <class T>
int write_by_type(const T& x)
{
return write_data((char*)&x, sizeof(T));
};
int read_data(char* data, size_t len)
{
if (length() < len)
return -1;
memcpy(data, rd_ptr(), len);
rd_ptr(len);
return 0;
};
int write_data(const char* data, size_t len)
{
return copy(data, len);
};
};
MessageBlock派生于ACE_Message_Block,封装了一下读写操作,这个应该不会产生问题。
由于代码比较多,贴上来可能不容易暴露出问题,我把我想的说一下吧。
整个逻辑可以看做是一个线程put,另外一个线程从队尾取走消息块
int put(MessageBlock* mb)
{
ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, guard, lock_, -1);
int rtn = mq_->enqueue_head(mb);
if (rtn<0)
printf("put MessageBlock enqueue_head rtn=%d eque_full=%d", rtn, mq_->isfull());
return rtn;
}
打印队列始终为“满”。即mq_->isfull()总是返回1
我的消息块大小为16k,我看了下ACE_Message_Queue默认的低水位标和高水位标都为16K
当超过高水位标时就不入队了。这个时候没有入队的MessageBlock是不是要自己写代码回收?
理想状态是所有MessageBlock都能入队列,所以我在队列初始化的时候,调用
mq_->low_water_mark(16*16*1024);
mq_->high_water_mark(16*1024*1024);
把高、低水位标设置大很多。
但是还是会发现进入下面语句
if (rtn<0)
printf("put MessageBlock enqueue_head rtn=%d eque_full=%d", rtn, mq_->isfull());
其中rtn=-1, eque_full=1 |
|