rainfish 发表于 2008-12-27 22:35:33

ACE_Message_Block链表是不是在多线程需要互斥?

我用ACE_Stream做网络通信时,需要用到多个ACE_Message_Block组成链表,在Module之间传输,多次用到
mb->duplicate()   
mb->release();

在做压力测试时,大量数据同时到来,有时在mb->release();中出现崩溃,查了一些资料,发现可能是并发时需要加锁,难道ACE_Message_Block没有锁机制吗?请高手释疑。

rainfish 发表于 2008-12-28 00:20:55

回复 #1 rainfish 的帖子

问题应该是解决了,我把线程之间传递时把
mb->duplicate()   
mb->release();
去掉了,直接把ACE_Message_Block指针putq到另一个线程,这样子就没问题了。但如果使用mb->duplicate()   传递需要加锁,不知道怎么办。

winston 发表于 2008-12-28 11:13:08

加锁就用锁处理一下啊。很简单的呀。
{
    ACE_Guard<ACE_Thread_Mutex> lock(m_lock);
    xxxx;
}
记得ACE_Message_Block也可以定制分配器,自己对内存进行一些管理和操作。但是具体细节已经忘记了,你在本站查一下。

rainfish 发表于 2008-12-28 21:45:12

回复 #3 winston 的帖子

谢谢老大,这种加锁方式对于普通操作还可以,但是对大量数据发送效率应该不是很高

winston 发表于 2008-12-29 12:38:01

不一定哦。
很多时候,瓶颈是网络和I/O,不是CPU和内存!

czf0754 发表于 2008-12-29 17:19:15

使用putq依然会用到加锁机制,原因是多个线程访问ACE_MessageQueue需要同步
页: [1]
查看完整版本: ACE_Message_Block链表是不是在多线程需要互斥?