我在C/Linux中有一个使用TCP套接字的聊天服务器。在使用libev时,我可以为套接字创建一次读取事件的ev_io监视程序。类似于:
ev_io* new_watcher = (ev_io*)malloc(sizeof(ev_io));
//initialize the watcher
ev_init(new_watcher, read_cb);
//set the fd and event to fire on write
ev_io_set(new_watcher, watcher->fd, EV_READ);
//start watching
ev_io_start(loop, new_watcher);这很好,因为read事件只有在有需要读取的数据时才会触发。然而,我必须以不同的方式对待写事件,因为即使在我没有数据可写的情况下,它们也会不断地触发。为了解决这个问题,我让我的read_callback为写数据创建一个ev_io监视器,只有当有数据准备要写的时候,然后write_callback在发送它的消息之后删除它。
这意味着每次需要处理消息时,我都在分配、初始化、设置、监视、取消和释放写观察器。我担心我可能处理得不正确,效率不高。
在libev中处理write_callback事件的最佳方法是什么?
提前谢谢。
发布于 2012-02-29 18:28:44
分配可能会增加一些开销,您可以使用一个静态变量而不是malloc,或者在事件循环完成后只使用malloc一次。您只需要在写之前设置,在成功后取消设置。但是的,这就是我们需要做的。
发布于 2012-12-22 03:38:14
很简单,也有ev_io_stop,所以除非您有任何要编写的东西,否则不启动写监视程序,并且在回调中,当您编写了整个缓冲区时,调用ev_io_stop。
在通常情况下,您很少溢出trhe写缓冲区(因为您的数据很小,而且不太频繁),您可以通过尝试直接写入数据(如果观察者没有活动),并且只在不能完全写数据的情况下缓冲数据和启动写监视程序来提高效率。
在上述假设下,这意味着您几乎不需要启动写观察器。缺点是代码要复杂得多,因此在许多情况下,最好先从简单的“追加数据以编写缓冲区,启动观察者,如果缓冲区已经完全写入”逻辑开始,在观察者内部停止它。
发布于 2012-07-10 20:00:26
解决这种情况的方法是有一个写入数据的函数,该函数接受一个指向缓冲区和长度的指针。它将指针和长度存储在队列数据结构中,并启用写事件。
当写事件回调触发时,它会检查写队列,以查看是否有任何挂起的写操作。如果存在,它将在队列中进行下一个挂起的写入,并将其写入文件描述符。然后,在写回调退出之前,它会检查挂起的写队列是否为空。如果是,则禁用写事件。
如果使读/写事件对象成为全局变量,则它们将只分配一次并释放一次。当您知道要写入的数据时,您将启用写事件,并且在没有需要写入的数据时禁用它。
我的代码比上面的描述要复杂一些,但是我会在这里发布一个链接,以便让您看一看。我特别提到的代码在aiofd.h和aiofd.c (aiofd ==异步I/O文件描述符)中:https://bitbucket.org/wookie/cutil/
我希望这能帮到你。
https://stackoverflow.com/questions/9451884
复制相似问题