C++ 创建一个像侦听器一样的函数

C++ Create a Function that acts like a listener

提问人:drilager60 提问时间:11/5/2023 最后编辑:drilager60 更新时间:11/5/2023 访问量:86

问:

我不知道该如何正确命名它,但是有没有办法在单独的线程上创建一个充当侦听器的函数,以便其他函数可以以某种方式附加到它?允许该函数在该侦听器中执行其代码。

void Listener::Run(){
   // create listener here
   // process whatever accesses this
}

然后在另一个文件和单独的命名空间/或类中,我们访问这个侦听器函数并重写它,以便我们调用完全相同的函数,但实现我们的代码,以便它异步执行它。

void Listener::Run(){
  //custom code that gets executed on actual listener function
}

这在C++中可以像在Java中一样完成吗?

C++ 函数 覆盖

评论

0赞 ChrisMM 11/5/2023
你说的是类中的继承和重写函数吗?virtual
1赞 HolyBlackCat 11/5/2023
如果我正确理解了这个问题,这通常被称为“信号”。它们不在标准 C++ 中,但有几个库实现了它们,例如 boost.signals2。
0赞 drilager60 11/5/2023
@ChrisMM我假设是这样,我将更新帖子以提供更好的理解。我很抱歉
0赞 drilager60 11/5/2023
@HolyBlackCat在查看了它的一些代码之后,是的,它看起来确实是我想要的。从技术上讲,我希望所述侦听器函数是可以在其他命名空间/类中访问的事件处理程序。但是,我无法使用 boost,所以我必须找到替代方案。谢谢你为我指明了正确的方向。
0赞 Swift - Friday Pie 11/5/2023
有几个库实现了这一点,它是一个信号\插槽架构,是订阅者\发布者模式的应用程序。

答:

0赞 Christophe 11/5/2023 #1

您可以很好地将一些侦听功能放在单独的胎面上运行。这在 I/O 和网络侦听中很常见。在线程之间的内部监听的上下文中,监听有点不那么简单,而且问题太宽泛,无法给出合理长度的答案。例如,您可以使用:

  • std::condition_variable 与互斥锁结合使用,以进行一些基于推送的侦听。另一种方法是 std::atomic_flag 系列。
  • 周期性地与唤醒时的队列查询相结合,以具有一些基于拉取的机制。std::this_thread::sleep_for
  • 使用一些高级的无锁输入队列,来实现一些消息/信号传递。

然而,不可能以一种干净的方式做的是,用一个派生类的新对象来替换一个对象,覆盖一些方法。有些人会说,是的,你可以在同一个地方摧毁对象并创建一个新对象,但要完成这项工作充满了伏击和 UB 的风险。ListenerListener

设计此方法的正确替代方案是在单独的线程中运行一个使用策略模式的侦听器对象,即实际侦听或传入侦听的处理由另一个对象(策略)完成,然后只需替换策略即可。在多线程上下文中,您只需确保以无害的方式进行替换,即不破坏当前正在另一个线程中使用的对象(通常,您会为此使用一些互斥锁)。

我强烈建议阅读 Antony William 的书“C++ 并发在行动中”,该书完全致力于多线程编程,因为多线程非常棘手。此外,它可能会让你看到其他方法,这些方法可能比听众范式更有效。