首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多次调用uv_run正常吗?

多次调用uv_run正常吗?
EN

Stack Overflow用户
提问于 2016-10-19 20:02:50
回答 1查看 352关注 0票数 1

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

代码语言:javascript
复制
#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");
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-11-21 15:32:15

抛开您的示例不谈,libuv提供了多次运行循环的机会。

有关更多详细信息,请参阅documentation

特别是,uv_run函数接受uv_run_mode类型的参数。

可能的值包括:

  • UV_RUN_DEFAULT:它不会停止,除非您显式地停止它,直到在loop.
  • UV_RUN_ONCE:轮询I/O一次并执行所有准备好提供服务的函数之前,它至少存在于被引用或活动的资源上。它的缺点是,如果没有挂起的callbacks.
  • UV_RUN_NOWAIT:,它就会阻塞这可能是您正在寻找的回调,类似于前面的回调,但如果没有挂起的回调,它就不会阻塞。

请注意,对于UV_RUN_ONCEUV_RUN_NOWAIT,您必须多次运行循环。

返回值通常表示是否有其他挂起的回调。在这种情况下,循环迟早都要在将来运行。

最后一个模式,UV_RUN_NOWAIT,可能就是您要找的模式。

例如,它可以用于客户端有自己的循环并且不能阻塞libuv的循环的场景。

循环运行多次是正常的吗?

嗯,是的,但这主要取决于你的实际问题是否正确。

很难从100行的代码片段中判断出来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40130897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档