上次说到对于那种有内容的包 bool TCPServer::on_receive_data(int channel_id, void* data, int len) { packet pkt; { pkt.data = m_memPool.popPkt(len);//从内存池分配len大小的内存,返回地址,此处为什么使用内存池不太清楚 } memcpy(pkt.data, data, len); pkt.size = len; pkt.channel_id = channel_id; pkt.is_data = true; from_net_push_pkt(pkt);//放到无锁队列中 return true; } net启动的时候会创建一个线程专门从无锁队列中读包,然后放入共享内存中 bool TCPServer::recv(packet& pkt) { //((I_LibEvtServer*)m_spTCPServer[0].get())->run_once(); #ifdef BOOST_LOCKFREE if(m_all_packet.empty()) return false; void* p = pkt.data; bool hr = m_all_packet.pop(pkt); if(!hr) return false; if(pkt.is_data) { memcpy(p, pkt.data, pkt.size); //服务器有好多都是依照这个原理做的 m_memPool.pushPkt(pkt.data, pkt.size);//归还内存池(对于这种模式,我不太懂为什么这样,一个线程把包放入无锁队列中,另一个线程从无锁队列中读) } pkt.data = p; --consumer_count; return true; } 把这两个问题搞懂,接下来就是最难的共享内存部分了,弄懂这个部分,废大劲了