在Skynet中将消息队列分为:全局队列和服务队列,每个服务都有一个相应的服务队列用于存放于该服务相关的消息,而每个服务队列都会被全局队列所引用,每个工作线程通过从全局队列中取出相应的服务队列进行消息处理。相应的结构体为:
//每个服务队列的结构体
struct message_queue {
struct spinlock lock; //锁
uint32_t handle; //服务handle,用于定位服务,高8位为节点的编号
int cap; //服务队列中消息队列的容量
int head; //服务队列中消息队列的头
int tail; //服务队列中消息队列的尾
int release; //标记是否释放
int in_global; //标记该服务是否在全局队列中
int overload; //记录服务队列中消息超过阈值时的数量
int overload_threshold; //服务队列中消息的上限值,超过将会翻倍
struct skynet_message *queue; //消息队列
struct message_queue *next; //指向下一个服务
};
//全局队列的结构体
struct global_queue {
struct message_queue *head; //全局队列头
struct message_queue *tail; //全局队列尾
struct spinlock lock; //锁
};
全局队列的初始化:文件skynet_start.c中的s