2017-06-16 56 views
0

我使用libevent创建的大多数应用程序涉及一次读取回调,并且每当为请求打开一个新连接时,我将通过::event_new()分配一个新事件,然后通过::event_add()将该事件添加到事件库如何在libevent中共享回调

但是这样做的问题是,每次打开一个新的请求时,我都会分配内存并将其添加到事件循环中,实际上,我应该共享文件描述符的回调和事件。授予的内存分配不是这种应用程序的瓶颈,libevent是否提供了某种方式来与多个文件描述符共享事件?

+1

在你的问题中,“共享文件描述符的回调和事件”是什么意思?内存分配不可避免地要存储连接的状态以进行处理。 “事件”的状态与其他事件完全不同。你如何分享它来实现不同的功能?而且,当文件描述符未被使用(关闭)时,'select','poll','epoll'等操作系统可以重用这个文件描述符。你能详细说明一下你到底想做什么吗? – Azeem

+0

@Azeem我问过,因为我所有的阅读事件都是一样的,除了他们在等待的文件描述符 – Curious

+0

你能举一个代码示例吗?请使用一些支持的代码示例编辑您的问题。 – Azeem

回答

1

您不应该在文件描述符之间共享事件。这会在您的应用程序中造成混乱。 event_new()创建一个附加到您的文件描述符的事件。

您可以尝试使用event_assign()重新分配已使用的事件,但libevent文档明确指出不建议这样做。另外,管理某种游戏池中的花费事件可能并不像看起来那么微不足道,并且可能没有任何明显的性能收益。

+0

你能举一个你混乱的意思吗?除了给定的文件描述符外,我创建的所有读取事件都是相同的。我只是想了解这里的正确用法snd模式 – Curious

+0

事件绑定到套接字上,并触发该套接字上的事件。将事件附加到多个活动套接字将导致未定义的行为。这意味着你的程序可能会立即爆炸,或者以不确定的方式行事 - 这意味着从那时起,任何类型的错误都可能发生,例如事件在错误的套接字上被触发,死锁套接字,内存泄漏,难以追踪内存损坏等。 –