c++ - 在事件驱动/异步框架中使用第 3 方库的回调(无文件描述符)

标签 c++ events asynchronous

目标是拥有一个单线程事件驱动框架。最终用户将执行以下操作:

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() 的逻辑在到达用户之前发生在单独的线程中。这是不可取的,因为它需要容易出错的互斥锁、需要昂贵的线程切换(这是低延迟应用程序)以及其他问题。 (需要澄清的是,框架中的每个处理程序彼此之间必须是原子的,因为客户端应用程序中可能存在竞争条件。)

之前有没有其他人遇到过这种情况并活着讲述这个故事?

最佳答案

如果我理解正确的话:您的调度线程在某些系统调用(例如selectpoll)上被阻止,并且您想要onData 成员函数遵循相同的通知路径。

使用 pipe对我来说似乎是一个很好的解决方案,而且不会对设计造成太大影响:

  • select 监视管道的一端
  • 第三个库在调用时会回调管道的另一端

这允许“线程跳转”,唯一的问题是管道只能用作通知工具:onData 函数的参数必须在管道之间的某个位置排队通知和处理线程唤醒。

关于c++ - 在事件驱动/异步框架中使用第 3 方库的回调(无文件描述符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4307240/

相关文章:

c++ - 隔离C库类(C++代码)

c++ - char s1[ ] = "xyz"和 char *s1 = "xyz"

c# - WPF Canvas VisibilityChanged 事件

javascript - 从使用 .then() 的 Promise 转换为 async/await

c# - 发布可观察对象时异步创建挂起

具有正确地址但具有另一个随机值的 C++ 指针?

C++模板模板中的此类分配是什么意思?

security - Spring Security插件不引发事件

javascript - Javascript 事件处理程序存储在哪里?

javascript - 我可以在不使用计数变量的情况下解决 asyncMap 吗?