提问人:drilager60 提问时间:11/5/2023 最后编辑:drilager60 更新时间:11/5/2023 访问量:86
C++ 创建一个像侦听器一样的函数
C++ Create a Function that acts like a listener
问:
我不知道该如何正确命名它,但是有没有办法在单独的线程上创建一个充当侦听器的函数,以便其他函数可以以某种方式附加到它?允许该函数在该侦听器中执行其代码。
void Listener::Run(){
// create listener here
// process whatever accesses this
}
然后在另一个文件和单独的命名空间/或类中,我们访问这个侦听器函数并重写它,以便我们调用完全相同的函数,但实现我们的代码,以便它异步执行它。
void Listener::Run(){
//custom code that gets executed on actual listener function
}
这在C++中可以像在Java中一样完成吗?
答:
0赞
Christophe
11/5/2023
#1
您可以很好地将一些侦听功能放在单独的胎面上运行。这在 I/O 和网络侦听中很常见。在线程之间的内部监听的上下文中,监听有点不那么简单,而且问题太宽泛,无法给出合理长度的答案。例如,您可以使用:
std::condition_variable
与互斥锁结合使用,以进行一些基于推送的侦听。另一种方法是std::atomic_flag
系列。- 周期性地与唤醒时的队列查询相结合,以具有一些基于拉取的机制。
std::this_thread::sleep_for
- 使用一些高级的无锁输入队列,来实现一些消息/信号传递。
然而,不可能以一种干净的方式做的是,用一个派生类的新对象来替换一个对象,覆盖一些方法。有些人会说,是的,你可以在同一个地方摧毁对象并创建一个新对象,但要完成这项工作充满了伏击和 UB 的风险。Listener
Listener
设计此方法的正确替代方案是在单独的线程中运行一个使用策略模式的侦听器对象,即实际侦听或传入侦听的处理由另一个对象(策略)完成,然后只需替换策略即可。在多线程上下文中,您只需确保以无害的方式进行替换,即不破坏当前正在另一个线程中使用的对象(通常,您会为此使用一些互斥锁)。
我强烈建议阅读 Antony William 的书“C++ 并发在行动中”,该书完全致力于多线程编程,因为多线程非常棘手。此外,它可能会让你看到其他方法,这些方法可能比听众范式更有效。
评论
virtual