data_server线程模型,一个网络线程往队列里面放读取到的Packet,N个worker线程竞争这个队列的锁,然后取Packet.
比较低效
放入队列的 时候,读队列和写队列都有单独的,先放到这个单独的队列里面,然后调用moveTo,放到自己local的_queue中。跟ATS类似的思路
/*
* 移动到其他队列上*/
void PacketQueue::moveTo(PacketQueue *destQueue) {
if (_head == NULL) { // 是空链
return;
}
if (destQueue->_tail == NULL) {
destQueue->_head = _head;
} else {
destQueue->_tail->_next = _head;
}
destQueue->_tail = _tail;
destQueue->_size += _size;
_head = _tail = NULL;
_size = 0;
}
一般的做法都是两个链表,一个供外部往里面写,一个供自己读取。批量处理,然后把外部链表连接到本链表上