如何在任何事件发生之前唤醒 epoll_wait()?
How to wake up epoll_wait() before any event happened?
我有一个 Connection
对象,表示由 epoll
管理的连接。在事件中,调用 Connection::eventWrite()
或 Connection::eventRead()
。连接是持久的(始终存在)。
我需要从另一个线程通过 Connection
发送数据,但不想直接访问对象 Connection
,因为我不想解决 [=11] 内部的多线程问题=] 对象(Connection
从 epoll
线程和 "sending thread" 访问)。相反,我想告诉 epoll
-thread: "wake up and do something with Connection
" --epoll_wait()
应该 return 并且我的代码会发现 CUSTOM EVENT
发生了(并且,例如,应该调用一些函数,其中将执行对 Connection
的所需访问(将发送数据分配给对象,调用 writeEvent()
),然后 epoll_wait()
-loop 将继续。
唤醒 epoll_wait()
有哪些解决方案,哪个更快?现在,我想到了创建一个 pipe
(由相同的 epoll
处理)并向其写入一个字节 1
。还有什么 IPC 可以通过 int
"epollable" 文件描述符来表达?
Epoll 可以等待 eventfd
。在您的情况下,我会创建一个 eventfd
并触发此事件。我认为,这是最干净的解决方案。
我有一个 Connection
对象,表示由 epoll
管理的连接。在事件中,调用 Connection::eventWrite()
或 Connection::eventRead()
。连接是持久的(始终存在)。
我需要从另一个线程通过 Connection
发送数据,但不想直接访问对象 Connection
,因为我不想解决 [=11] 内部的多线程问题=] 对象(Connection
从 epoll
线程和 "sending thread" 访问)。相反,我想告诉 epoll
-thread: "wake up and do something with Connection
" --epoll_wait()
应该 return 并且我的代码会发现 CUSTOM EVENT
发生了(并且,例如,应该调用一些函数,其中将执行对 Connection
的所需访问(将发送数据分配给对象,调用 writeEvent()
),然后 epoll_wait()
-loop 将继续。
唤醒 epoll_wait()
有哪些解决方案,哪个更快?现在,我想到了创建一个 pipe
(由相同的 epoll
处理)并向其写入一个字节 1
。还有什么 IPC 可以通过 int
"epollable" 文件描述符来表达?
Epoll 可以等待 eventfd
。在您的情况下,我会创建一个 eventfd
并触发此事件。我认为,这是最干净的解决方案。