libuv学习-事件循环

本文详细解释了libuv库中的事件循环机制,通过uv_loop_new,uv_loop_init,uv_run和uv_loop_close等函数的使用示例,展示了事件循环的生命周期,以及如何在C++中管理和控制事件处理流程。
摘要由CSDN通过智能技术生成

一. 事件循环的例子

#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.com/
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值