admin管理员组文章数量:1565831
一. 事件循环的例子
#include <uv.h>
#include <iostream>
void timer_callback(uv_timer_t* timer) {
// Callback logic here
std::cout << "Timer callback" << std::endl;
}
int main() {
uv_loop_t* loop = uv_loop_new();
uv_loop_init(loop);
uv_timer_t timer;
uv_timer_init(loop, &timer);
uv_timer_start(&timer, timer_callback, 1000, 1000);
uv_run(loop, UV_RUN_DEFAULT);
uv_loop_close(loop);
return 0;
}
这个例子包含事件循环的句柄(loop),经历初始化,运行,停止,关闭等流程。
二. 代码解析
1. 结构体
uv_loop_t
struct uv_loop_s {
/* 用户自定义数据. */
void* data;
/* 活跃状态句柄计数器. */
unsigned int active_handles;
void* handle_queue[2];
union {
/* 未来扩展 */
void* unused;
/* 对在线程池中调用的异步I/O进行计数 */
unsigned int count;
} active_reqs;
/* Internal storage for future extensions. */
void* internal_fields;
/* 内部标志,用于信号循环停止 */
unsigned int stop_flag;
UV_LOOP_PRIVATE_FIELDS
};
typedef struct uv_loop_s uv_loop_t;
是一个句柄handle类型,管理了事件循环的所有资源。
2. 函数
uv_loop_new
uv_loop_t* uv_loop_new(void);
用于创建事件循环(event loop),事件循环是 libuv 中的核心概念,负责监听事件并调用相应的回调函数进行处理。
uv_loop_init
int uv_loop_init(uv_loop_t* loop);
初始化uv_loop_t结构体,注意调用之前需要先给uv_loop_t分配内存资源,否则会导致程序崩溃
uv_run
int uv_run(uv_loop_t * loop, uv_run_mode mode);
这个函数是libuv中的事件循环函数,负责执行事件循环并处理异步事件
uv_run_mode定义了三种运行模式
UV_RUN_DEFAULT,在这种模式下,事件循环会一直运行到没有待处理的事件或者通过调用’uv_stop()'函数请求停止事件循环为止。
UV_RUN_ONCE,在这种模式下,事件循环会执行一次事件处理循环,然后立即返回。即使是事件循环中有未处理的事件,也会在处理完一次事件后立即返回。
UV_RUN_NOWAIT:在这种模式下,事件循环会尝试执行一次事件处理循环,但不会等待事件的发生。如果没有事件需要处理,uv_run() 函数将立即返回。如果有事件需要处理,它会处理这些事件,并在处理完毕后返回。
该函数的作用包含:
启动事件循环:调用 uv_run() 函数将启动 libuv 的事件循环,程序将进入事件循环状态,开始监听事件。
处理事件:在事件循环中,libuv 会不断地检查是否有事件发生,例如文件读写完成、定时器超时等。一旦有事件发生,libuv 将调用注册的回调函数来处理事件。
监听退出条件:uv_run() 函数还会检查事件循环是否应该退出,例如是否调用了 uv_stop() 函数来请求停止事件循环,或者是否没有待处理的事件了。
返回控制权:一旦事件循环结束,uv_run() 函数将返回,程序可以继续执行后续的操作。
uv_loop_close
int uv_loop_close(uv_loop_t* loop);
用于关闭事件循环(event loop),该函数的作用:
停止事件循环:调用 uv_loop_close() 函数将停止当前事件循环的运行。
等待事件处理完成:在关闭事件循环之前,uv_loop_close() 函数会等待当前正在进行的事件处理完成。
释放资源:一旦事件循环关闭完成,uv_loop_close() 函数将释放与事件循环相关的资源,包括内存资源和其他系统资源。
参考
libuv官方文档
https://libuv-docs-chinese.readthedocs.io/zh/latest/
chatgpt
https://chat.openai/
版权声明:本文标题:libuv学习-事件循环 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1725587857a1031372.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论