ACE_Message_Block链表是不是在多线程需要互斥?
我用ACE_Stream做网络通信时,需要用到多个ACE_Message_Block组成链表,在Module之间传输,多次用到mb->duplicate()
mb->release();
在做压力测试时,大量数据同时到来,有时在mb->release();中出现崩溃,查了一些资料,发现可能是并发时需要加锁,难道ACE_Message_Block没有锁机制吗?请高手释疑。
回复 #1 rainfish 的帖子
问题应该是解决了,我把线程之间传递时把mb->duplicate()
mb->release();
去掉了,直接把ACE_Message_Block指针putq到另一个线程,这样子就没问题了。但如果使用mb->duplicate() 传递需要加锁,不知道怎么办。 加锁就用锁处理一下啊。很简单的呀。
{
ACE_Guard<ACE_Thread_Mutex> lock(m_lock);
xxxx;
}
记得ACE_Message_Block也可以定制分配器,自己对内存进行一些管理和操作。但是具体细节已经忘记了,你在本站查一下。
回复 #3 winston 的帖子
谢谢老大,这种加锁方式对于普通操作还可以,但是对大量数据发送效率应该不是很高 不一定哦。很多时候,瓶颈是网络和I/O,不是CPU和内存! 使用putq依然会用到加锁机制,原因是多个线程访问ACE_MessageQueue需要同步
页:
[1]