说明
本文主要是个人在工作中使用到libuv-queue.h中的队列实现,在这里记录下常见的使用方式,并不对queue具体实现原理做剖析。
使用示例
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "queue.h"
typedef struct myNode_s
{
QUEUE queue;
int val;
} myNode_t;
typedef struct audit_s {
QUEUE req_queue;
QUEUE resp_queue;
} audit_t;
/**
* @brief 遍历队列并删除所有节点
*/
void clear_queue(QUEUE *queue)
{
while(!QUEUE_EMPTY(queue)) {
// 每次删除头节点
QUEUE *q = QUEUE_HEAD(queue);
QUEUE_REMOVE(q);
myNode_t *req_node = QUEUE_DATA(q, myNode_t, queue);
free(req_node);
}
}
/**
* @brief 用于遍历队列,不能在其中插入删除节点的操作
*/
void travel_queue(QUEUE *queue)
{
myNode_t *req_node;
QUEUE *q;
QUEUE_FOREACH(q, queue) {
req_node = QUEUE_DATA(q, myNode_t, queue);
printf("val: %d\n", req_node->val);
}
}
int main()
{
audit_t *audit = malloc(sizeof(audit_t));
QUEUE_INIT(&audit->req_queue);
QUEUE_INIT(&audit->resp_queue);
// 插入数据
for (int i = 0; i < 10; i++) {
myNode_t *req_node = malloc(sizeof(myNode_t));
req_node->val = i;
QUEUE_INSERT_TAIL(&audit->req_queue, &req_node->queue);
// printf("Inserted req value: %d\n", i);
myNode_t *resp_node = malloc(sizeof(myNode_t));
resp_node->val = i + 10;
QUEUE_INSERT_TAIL(&audit->resp_queue, &resp_node->queue);
// printf("Inserted resp value: %d\n", i + 10);
}
// test travel queue
travel_queue(&audit->req_queue);
#if 0
// test clear queue
clear_queue(&audit->req_queue);
if (!QUEUE_EMPTY(&audit->req_queue)) {
printf("Error: req_queue is not empty after clear\n");
} else {
printf("req_queue is empty after clear\n");
}
#endif
#if 0
// 审计出队列
printf("Auditing request queue...\n");
while (!QUEUE_EMPTY(&audit->req_queue) && !QUEUE_EMPTY(&audit->resp_queue)) {
QUEUE *q = QUEUE_HEAD(&audit->req_queue);
QUEUE_REMOVE(q);
myNode_t *node = QUEUE_DATA(q, myNode_t, queue);
QUEUE *q2 = QUEUE_HEAD(&audit->resp_queue);
QUEUE_REMOVE(q2);
myNode_t *node2 = QUEUE_DATA(q2, myNode_t, queue);
printf("Request value: %d, Response value: %d\n", node->val, node2->val);
free(node);
free(node2);
}
#endif
return 0;
}
总结
上述示例主要涉及以下几个部分:
- 队列初始化
- 队列数据插入
- 队列遍历获取节点值
- 删除队列