`
aigo
  • 浏览: 2647695 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

[libuv]uv_loop_close和uv_stop的区别

阅读更多

作者:@玄冬Wong

uv_loop_close:是释放掉uv_loop_t*指针相关的资源;

uv_stop:是退出当初由uv_run()运行的正在阻塞中的逻辑;

 

当程序完全退出需要清理全部uv相关的资源时,具体清理方式如下:

1,这里假设你在函数A中执行了初始化的逻辑

uv_loop_t* loop = malloc(sizeof *loop);
uv_loop_init(loop);

const int r = uv_run(loop, UV_RUN_DEFAULT);
ASSERT(0 == r);

 ,

2,然后假设需要在函数B中终止uv_run

uv_stop(loop);

 

3,上面stop以后不能马上执行uv_loop_close(),应该再定义一个函数C,当上面函数A中退出uv_run之后调用函数C,在函数C中free掉loop指针

uv_loop_close(loop);
free(loop);

 为什么不能直接在函数B中close掉?因为当执行uv_stop之后,uv_run并不能马上退出,而是要等待其内部循环的下一个iteration到来时才会退出;如果提前free掉loop就会导致函数A中的loop指针失效。当然也可以sleep几十毫秒然后再close,但这么搞不太雅观。

 

分享到:
评论

相关推荐

    libuv关于TCP UDP以及文件操作的封装测试

    在文件操作方面,libuv提供了对常规文件系统操作的封装,如`uv_fs_open`打开文件,`uv_fs_read`读取,`uv_fs_write`写入,`uv_fs_fsync`同步文件到磁盘,以及`uv_fs_close`关闭文件。这些函数都以异步方式运行,确保...

    libuv_libuv_接码利用_

    如果你打算学习libuv,首先应该了解其基本结构和核心概念,如事件循环(event loop)、Handle、Request对象等。然后,通过阅读源代码和示例程序,可以理解如何创建和管理异步操作。此外,编译和运行示例程序也是快速...

    libuv API说明及用例

    uv_loop_close(loop); return 0; } ``` ##### 示例 2:异步 DNS 解析 ```c #include <uv.h> #include void on_resolve(uv_getaddrinfo_t* req, int status, struct addrinfo* res) { if (status) { fprintf...

    libuv_message_framing:libuv的消息框架

    uv_msg_init (loop, socket, UV_TCP); Unix域套接字或命名管道的流初始化 uv_msg_t * socket = malloc( sizeof ( uv_msg_t )); uv_msg_init (loop, socket, UV_NAMED_PIPE); 传送讯息 uv_msg_send (( uv_msg_write_t...

    spawn:一个简单的“ uv_spawn”包装器API即可执行和管理子进程,并行异步PHP用于阻止IO

    一个简单的uv_spawn包装器API,用于执行和管理子进程(用于阻止I / O的并行/异步PHP)。 该软件包使用Node.js库的 (PHP扩展 )的功能。 它的uv_spawn函数用于启动进程。 性能是一个更好的选择到了pcntl扩展,或...

    libuv-v1.42.0windows64位vs2015/2017项目

    uv_close((uv_handle_t*)stream, nullptr); } free(buf->base); }); } else { uv_close((uv_handle_t*)client, nullptr); } } int main() { uv_loop_t* loop = uv_default_loop(); uv_tcp_t server; uv_...

    libuv_tcp, 使用libuv的tcp服务器和客户端包.zip

    libuv_tcp, 使用libuv的tcp服务器和客户端包 欢迎来到libuv_tcp维基 !简介:libuv_tcp是一个包含tcp服务器和客户端的C 类,它使用libuv包。用法:请参阅 [ test_tcpserver.cpp ] 1 和 [ test_tcpclient.cpp

    uv_callback:libuv线程通信

    它是uv_async的替代品,但有一些区别: 它支持合并和非合并调用它支持同步和异步调用它支持将参数传递给被调用的函数支持结果通知回调使用范例将进度发送到主线程在这种情况下,如果工作运行得太快,则调用可以并且...

    node-dlopen:本地绑定到 libuv 的 uv_dlopen() 和朋友

    本地绑定到 libuv 的 uv_dlopen() 和朋友 该模块提供对 libuv 的dlopen() 、 dlclose() 、 dlsym()和dlerror()函数的访问。 还导出了一个高级面向对象的Library类。 安装 使用npm安装: $ npm install dlopen ...

    libuv-1.x_epolllibuv_libuvepoll_

    标题中的 "libuv-1.x_epoll" 和 "libuv_libuvepoll" 指的是 `libuv` 在 `Linux` 系统上对 `epoll` 系统调用的封装和扩展。本文将详细介绍 `libuv` 如何利用 `epoll` 提供的事件驱动模型以及其带来的优势。 首先,`...

    net_uv:使用C ++封装libuv的网络库

    在net_uv中,我们可以通过创建`uv_loop_t`对象来启动事件循环,这是libuv的基石。在这个循环中,你可以注册各种处理器,如TCP服务器(`uv_tcp_t`)和UDP服务器(`uv_udp_t`),它们会在接收到数据或完成其他异步操作...

    C语言libuv-1.42.0源码

    - libuv提供了一套完整的错误处理机制,通过返回码和错误字符串(`uv_strerror`)来报告问题,帮助开发者调试和优化代码。 8. **内存管理** - 内存管理是libuv中的重要组成部分,它提供了一些接口如`uv_malloc`、...

    编译好的libuv

    7. **结束和清理**:在程序结束时,记得调用`uv_loop_close`关闭事件循环,并执行必要的清理工作。 总的来说,这个压缩包提供了一整套用于在项目中使用libuv的必要组件,使得开发者可以轻松地利用libuv的强大功能来...

    libuv-vc6-master_libuv在xp下使用vc6.0_

    为了验证其功能,可以编写一个简单的测试程序,调用libuv的API,如uv_loop_new()和uv_run(),观察是否能够正常启动和执行异步操作。 总结: 在Windows XP上使用VC6.0和libuv是一项挑战,但并非不可能。通过调整编译...

    libuv源代码移植到CLion工程

    在IT行业中,libuv是一个非常重要的跨平台异步I/O库,主要用于处理各种操作系统下的网络和文件系统操作。它的设计目标是为Node.js提供底层支持,但也可以独立使用。CLion是一款由JetBrains公司开发的强大C/C++集成...

    libuv_tcp的基于libuv库的c++实现.zip

    首先,需要初始化libuv的事件循环(Event Loop),这是libuv的核心部分,负责调度所有异步操作。接着,创建一个TCP服务器监听指定的端口,当有新的连接请求到达时,会触发连接回调函数,此时可以接受连接并为每个...

    libuv-httpserver-源码.rar

    4. 连接关闭:在`http_server_close_connection`函数中,libuv-httpserver会关闭连接,释放相关资源,防止内存泄漏。 四、最佳实践与优化 1. 非阻塞I/O:libuv-httpserver充分利用libuv的非阻塞I/O特性,即使在高...

    libuv udptcp的封装.rar

    使用libuv,可以非常方便的创建tcp服务端,基本上除了初始化,其他所有的处理都是在回调函数中处理的。可以非常轻松的实现异步读写。其中需要注意的是,uv_read_start的第二个参数,uv_alloc_cb回调函数,在每次接收...

    libuv_ex:libuv_ex

    3. **网络通信**:libuv_ex可能展示了TCP或UDP服务器和客户端的创建,以及数据的发送和接收。这对于构建网络服务或实现分布式系统至关重要。 4. **线程和工作队列**:通过libuv的线程池,可以提交耗时的计算任务,...

    libuv封装,封装libuv网络库

    你需要将 Libuv 的 `uv_loop_t` 结构封装到类中,然后提供开始、停止循环的方法。同时,需要适配 Libuv 的事件回调,将它们转化为面向对象的事件处理。 5. **错误处理**:封装 Libuv 应该提供清晰的错误处理机制,...

Global site tag (gtag.js) - Google Analytics