Libuv库(探讨)---第七节:高级调度

索引目录:https://blog.csdn.net/knowledgebao/article/details/84776754


libuv的loop为提供了相当大的用户控制权,您可以通过处理多个循环来实现有趣的结果。您还可以将libuv的事件循环嵌入到另一个基于事件循环的库中 - 想象一下基于Qt的UI,以及Qt的事件循环驱动一个libuv后端,让它执行密集的系统级任务。

libuv提供一个uv_stop函数,用于停止loop的执行,当然uv_stop不会让loop立刻停止,而是通过设置stop_flag来控制loop的执行,具体可以参考https://blog.csdn.net/knowledgebao/article/details/82251513

下边做一个简单说明:

  }
}


int uv_is_closing(const uv_handle_t* handle) {
  return uv__is_closing(handle);
}


int uv_backend_fd(const uv_loop_t* loop) {
  return loop->backend_fd;
}


int uv_backend_timeout(const uv_loop_t* loop) {
  if (loop->stop_flag != 0)
    return 0;

  if (!uv__has_active_handles(loop) && !uv__has_active_reqs(loop))
    return 0;

stop_flag被设置的时候,循环可能在任何一个位置,stop_flag的作用使uv_backend_timeout()返回0,保证循环不会阻塞。在最后正常退出。如果stop_flag在uv_backend_timeout()之后设置,下一轮才会生效。如果stop_flag在uv_backend_timeout()之前设置,本轮循环的部分逻辑也会正常执行,并且正常触发回调。

下边给出一个uv_stop的例子,可以看看是否和预期一致。

#include <stdio.h>
#include <uv.h>

int64_t counter = 0;

void idle_cb(uv_idle_t *handle) {
    printf("Idle callback\n");
    counter++;

    if (counter >= 5) {
        uv_stop(uv_default_loop());
        printf("uv_stop() called\n");
    }
}

void prep_cb(uv_prepare_t *handle) {
    printf("Prep callback\n");
}

int main() {
    uv_idle_t idler;
    uv_prepare_t prep;

    uv_idle_init(uv_default_loop(), &idler);
    uv_idle_start(&idler, idle_cb);

    uv_prepare_init(uv_default_loop(), &prep);
    uv_prepare_start(&prep, prep_cb);

    uv_run(uv_default_loop(), UV_RUN_DEFAULT);

    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值