在libev中锁定io观察者和计时器表

时间:2016-01-15 09:00:47

标签: c race-condition libev

在libev中,我已经启动了io观察器来捕获事件,这个事件导致在某些缓存中存储某些值。我有另一个计时器观察器,每10秒运行一次,读取缓存值。在这种情况下,我认为存在竞争条件。我是否需要在两个不同的libev观察者中使用锁或者自由处理它。

例如:

 TCP_CACHE_TIMEOUT = g_hash_table_new_full(g_str_hash, g_int_equal, key_destroy_cb, value_destroy_timeoutcb);
    zlog_info(_c,"TCP Server started at _port: %d",_port);
    int fd =setup_tcp_socket(_port);
    if(fd<0)
    {
        return NULL;
    }

    struct ev_loop *loop = EV_DEFAULT;

    struct _sock_ev_serv server;
    server.fd = fd;
    ev_io_init(&server.io, event_server, server.fd, EV_READ);
    ev_io_start(EV_A_ &server.io);

    ev_timer_init (&timeout_watcher, timeout_idle_fd, 0, 10.);
    ev_timer_again (loop,&timeout_watcher);

    ev_loop(loop, 0);  

这里我有循环并启动io watcher接受服务器事件,并且计时器观察者每隔10秒查看一次缓存。在这种情况下,我是否需要自己处理竞争条件,或者两个观察者io和计时器运行时间由libev管理?

1 个答案:

答案 0 :(得分:1)

简短回答:没有竞争条件,你不需要锁定。

更长的回答:
没有竞争条件的原因是因为libev在循环中检查io观察者,然后是计时器,然后是io,然后是计时器......
无论先触发哪一个,都先运行。两个回调之间没有重叠。

但是,如果您使用的是线程事件循环(可能,但不太可能通过您的代码判断),并且您在两个不同的线程中读取同一文件,则会出现竞争条件,您需要锁定

实施例:
如果您在0.9秒后在io观察器中获得数据,并且该观察者的回调需要0.2秒才能运行,则在io回调结束后(~10.1秒)将调用您的计时器。