gpt4 book ai didi

c - 多次调用uv_run是否正常?

转载 作者:太空宇宙 更新时间:2023-11-04 03:27:16 27 4
gpt4 key购买 nike

我是 uvlib 的新手。如果想避免内部函数阻塞,两次调用 uv_run 是否正常?如果没有,那么除了线程之外还有哪些工具可用?在这里我只是打开和关闭文件。

#include <uv.h>
#include <stdio.h>
#include <fcntl.h>
#include <conio.h>
#ifdef _WIN32
#include <conio.h>
#include <Windows.h>
#define Sleep(x) Sleep(x)
#else
#include <unistd.h>
#define Sleep(x) sleep(x)
#endif

uv_loop_t* loop;

uv_fs_t open_req;
uv_fs_t close_req;

void open_cb(uv_fs_t*);
void close_cb(uv_fs_t*);

const char *filename = "C:/c/somedata.txt";

int main(int argc, char **argv) {
int r;

loop = uv_loop_new();

r = uv_fs_open(loop, &open_req, filename, O_RDONLY, S_IREAD, open_cb);
if (r < 0) {
printf("Error at opening file: %s\n", uv_strerror(r));
}
printf("in main now\n");
uv_run(loop, UV_RUN_DEFAULT);
uv_loop_close(loop);
return 0;
}

void open_cb(uv_fs_t* req) {
int result = req->result;

if (result < 0) {
printf("Error at opening file: %s\n", uv_strerror(result));
} else {
printf("Successfully opened file.\n");
}
uv_fs_req_cleanup(req);
uv_fs_close(loop, &close_req, result, close_cb);
uv_run(loop, UV_RUN_DEFAULT);
Sleep(5000);
printf("ok now\n");
}

void close_cb(uv_fs_t* req) {
int result = req->result;
printf("in close_cb now\n");

if (result < 0) {
printf("Error at closing file: %s\n", uv_strerror(result));
} else {
printf("Successfully closed file.\n");
}
}

最佳答案

抛开您的示例,libuv 提供了多次运行循环的机会。
查看documentation了解更多详情。

特别是,uv_run 函数接受类型为 uv_run_mode 的参数。
可能的值是:

  • UV_RUN_DEFAULT:它不会停止,除非您明确停止它并且直到循环中至少存在一个引用或事件资源。

  • UV_RUN_ONCE:轮询一次 I/O 并执行所有准备好提供服务的函数。它的缺点是如果没有挂起的回调,它就会阻塞。

  • UV_RUN_NOWAIT:这可能是您正在寻找的那个,与上一个类似,但如果没有挂起的回调,它不会阻塞。

    <

请注意,对于 UV_RUN_ONCEUV_RUN_NOWAIT,您必须多次运行循环。
返回值通常表示是否有其他一些挂起的回调。在这种情况下,循环迟早要运行。

最后一种模式,UV_RUN_NOWAIT,可能就是您正在寻找的模式。
例如,它可以用于客户端有自己的循环并且不能阻塞 libuv 循环的场景。


循环不止一次正常吗?
嗯,是的,但它是否正确主要取决于你的实际问题。
很难从 SO 上的 100 行代码片段中得出结论。

关于c - 多次调用uv_run是否正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40130897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com