- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 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/
这两个库都是为异步 I/O 调度而设计的,并且都在 Linux 上使用 epoll,在 FreeBSD 上使用 kqueue 等。 除了表面上的差异,我的意思是这两个库之间真正的差异是什么?关于架构,
假设我有 2 个正在监视事件的套接字,我真的希望套接字 1 成为首选(即使以耗尽套接字 2 为代价)。我如何用 libev 做到这一点(我问了关于 libuv 的同样问题 here 但看起来 libu
我想使用事件驱动库之一制作基本的聊天服务器。但是选择什么? libevent 或 libev 哪个更好?哪个有更好的 C++ 支持?哪个 rune 在 Windows 中更好?什么更快?更快地开发和理
我正在尝试监控一个 unix 套接字(“/tmp/mysocket”)。 我可以在 Node.js 中很好地做到这一点:当 1) 套接字被绑定(bind),2) 有人连接到套接字,3) 数据被发送到套
我正在尝试向后移植基于 libevent 的库以使用 ASIO 后端(从而避免在单个应用程序中出现多个事件循环)。还有其他方法可以解决“问题”,但我对这个感兴趣 我在 Boost::ASIO 文档中没
我目前正在使用libevent编写多线程应用程序。 某些事件是由IO触发的,但我需要使用event_active()由代码本身跨线程触发的几个事件。 我试图编写一个简单的程序来显示我的问题所在: 使用
我花了一些时间在互联网上搜索寻找更好的方法来分析和调试我的问题,但我似乎找不到解决方案。所以我想我会问。 简要地。我正在尝试创建一个非阻塞 ssl 转发代理。代理的服务器部分使用自签名服务器证书,我使
我有以下代码: #include #include #include #include #include void fd_cb(int fd,short event,void *arg){
我有几个关于 libevent2 及其多线程支持的问题。 libevent 是否支持多线程? 我想实现的是这样的: 在单个线程中创建一个 event_base。 在这个单线程中设置事件并将它们关联到事
我正在遵循this示例。 Line#37表示工作线程数应等于cpu核心数。为什么? 如果有1万个连接,而我的系统有8个核心,这是否意味着8个辅助线程将处理1万个连接?为什么我不应该增加这个数字? 最佳
我正在学习如何使用 Libevent。虽然我无法理解 pending 和 active 之间的区别。在我看来,当一个事件被添加到 event_base 并且事件还没有发生时,它就处于 pending
我想知道是否有关于如何编译 libev-dev 的说明在 Linux (CentOS) 64 位上。我找不到与 libev 相关的开发包,也找不到任何有关其编译的教程。p.s:请不要使用包管理器 -
我想知道是否有关于如何编译 libev-dev 的说明在 Linux (CentOS) 64 位上。我找不到与 libev 相关的开发包,也找不到任何有关其编译的教程。p.s:请不要使用包管理器 -
我正在学习 libev 并且偶然发现了这个问题。假设我想尽快处理某些事情,但不是现在(即不在当前执行函数中)。例如,我想将一些大型同步作业分成多个部分,这些部分将排队,以便其他回调可以在两者之间触发。
我有干净的centos6系统,尝试从源代码编译tor。第一种方式(通过 yum 安装 libevent)。我愿意: yum install libevent2 yum install libevent
我在代码中有结构指针 struct evkeyvalq *headers; 现在我调用一个函数,该函数将在结构中填充一些信息。 evhttp_parse_query(uri, headers) 我在这
Rant:我真的不喜欢 boost::asio,所以我一直在寻找替代方案并遇到了 libev。这对我来说似乎很简单,但正在做一些我无法理解的事情。如果一个线程中的问题太多,请告诉我。 1) 我将监听套
如果我们主要想要一个基于 epoll 的文件描述符循环,那么 libevent 还提供什么功能(对 http 或dns 东西)?? 我知道这是一个很大的项目,但对我来说编写一个 epoll 包装器 A
我在我的 Linux 'c' 应用程序中将 libev 用于计时器和 io 事件,我想将自定义数据与事件相关联。在 libev 文档中,它暗示了 associating custom data但没有给
在 C 中使用 libev 创建小型网络服务器时,在不阻塞 react 器的情况下提供文件服务(打开、就绪、写入套接字)的最佳策略是什么? 我有一些建议一次阅读几个区 block ,但我不确定这是正确
我是一名优秀的程序员,十分优秀!