Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1280182
  • 博文数量: 79
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 2719
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 12:07
个人简介

樽中酒不空

文章分类

全部博文(79)

文章存档

2024年(3)

2020年(4)

2019年(1)

2017年(2)

2016年(2)

2015年(7)

2014年(11)

2013年(13)

2012年(18)

2011年(2)

2010年(16)

分类: C/C++

2012-02-02 16:30:01

libev提供了ev_idle_set机制
当年在libevent里想了好多办法,修改了其内部机制才实现。现在看起来还是libev比较体贴,直接在api提供了这个功能。
libUV在上一层又封装了一下,更方便使用
例:

static uv_idle_t idle_handle;
uv_prepare_t uv_prepare_sleep;
uv_loop_t* uvloop;

static void idle_cb(uv_idle_t* handle, int status)
{

  static int idle_cb_called = 0;
  idle_cb_called++;
  printf("idle_cb %d\n", idle_cb_called);
}

main()
{
...
    uvloop = uv_default_loop();

    uv_prepare_init(uvloop, &uv_prepare_sleep);

    int r = uv_idle_init(uv_default_loop(), &idle_handle);

    r = uv_idle_start(&idle_handle, idle_cb);

    uv_run(uvloop);
}
一般情况下,epoll有事件来的时候,会触发相应的事件。但是程序在等待事件的空闲时间可以做很多事情,如果用的好的话,完全可以避免到处加锁。比如小型IM的server,需要定时检查用户在线状态,一般直接的想法就是做个定时器,每隔1分钟检查一次,保活失效就remove掉。但定时到达的时候,有可能连接正忙,表现形式就是在这里稍稍卡一下(当然直接是感觉不出来的)。而且,这时有可能有事件发生,需要同时访问用户表,需要加锁。
    而利用好idle就解决这个问题了:每个idle回调检查list的一个元素,失效就remove,否则更新计时,同时list指针下移一位。下一个idle回调,再检查下一个用户。因为idle是和事件先后出现的,访问同一个list时间也是先后的,不用加锁。
阅读(8252) | 评论(0) | 转发(0) |
0

上一篇:Redis在Windows下编译

下一篇:libUV 写 TCPServer

给主人留下些什么吧!~~