目标是拥有一个单线程事件驱动框架。最终用户将执行以下操作:
class MyEventFramework : public EventFramework {
protected:
virtual void onData (const Data& data);
virtual void onReport (const Report& report);
virtual void onUserRequest (const UserRequest& userRequest);
...
};
幕后还有其他组件,例如一系列计时器等。
大多数这些处理程序都是由我自己的代码调用的,因此我可以使用 select()
或类似的概念(kqueue()
、epoll()
等)通过一系列文件描述符。
我的问题是 onData()
例程实际上是来自第三方库的回调,我没有其源代码。因此,我不能只使用他们的文件描述符;我只知道通过回调发生了一些事情。
现在我的框架有一个多线程实现;导致 onData()
的逻辑在到达用户之前发生在单独的线程中。这是不可取的,因为它需要容易出错的互斥锁、需要昂贵的线程切换(这是低延迟应用程序)以及其他问题。 (需要澄清的是,框架中的每个处理程序彼此之间必须是原子的,因为客户端应用程序中可能存在竞争条件。)
之前有没有其他人遇到过这种情况并活着讲述这个故事?
最佳答案
如果我理解正确的话:您的调度线程在某些系统调用(例如select
或poll
)上被阻止,并且您想要onData
成员函数遵循相同的通知路径。
使用 pipe对我来说似乎是一个很好的解决方案,而且不会对设计造成太大影响:
select
监视管道的一端- 第三个库在调用时会回调管道的另一端
这允许“线程跳转”,唯一的问题是管道只能用作通知工具:onData
函数的参数必须在管道之间的某个位置排队通知和处理线程唤醒。
关于c++ - 在事件驱动/异步框架中使用第 3 方库的回调(无文件描述符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4307240/