gpt4 book ai didi

c - 在 libev 中锁定 io watcher 和 timer watch

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

在 libev 中,我已经启动了 io 观察器来捕获事件,这个事件导致在某些缓存中存储特定值。我有另一个定时器观察器,每 10 秒运行一次,读取缓存值。在这种情况下,我认为存在竞争条件。我需要在两个不同的 libev 观察器中使用锁还是 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 以接受服务器事件,并且 timer watcher 每 10 秒查看一次缓存。在这种情况下,我需要自己处理竞争条件还是两个观察者 io 和计时器运行时间由 libev 管理?

最佳答案

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

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

但是,如果您正在使用线程事件循环(可能,但根据您的代码判断不太可能),并且您正在两个不同的线程中读取同一个文件,那么就会出现竞争条件,您将需要一个锁.

例子:
如果您在 0.9 秒后在 io 观察器中获取数据,并且您对该观察器的回调需要 0.2 秒才能运行,您的计时器将在 io 回调完成后(约 10.1 秒)被调用。

关于c - 在 libev 中锁定 io watcher 和 timer watch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34807481/

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