如何调用来自不同线程的回调?
How to invoke callback from different threads?
我有一个发布者-订阅者模式,其中发布者具有subscribeFoo(std::function<void(std::shared_ptr<Foo>)> callback)
,使订阅者能够在发布者中注册回调。并将回调保存到vector
中。当新Foo
出现时,通过迭代vector
中的所有回调来触发回调。但我的问题是如何支持多线程?说订阅者从发布者以外的其他线程订阅 Foo。那么我怎么能从注册的线程中触发该回调呢?我不知道如何实现它。
现在我有MyPublisher
void MyPublisher::subscribeFoo(std::function<void(std::shared_ptr<Foo>)> callback) {
callbacks_.push_back(callback);
}
void MyPublisher::notifyAll() {
auto f = std::make_shared<Foo>();
for (auto& cb: callbacks_) {
cb(f);
}
}
但是,这似乎仅支持单线程,对吗?
想法:在Qt中,有信号槽机制来实现这一点。即使在连接信号和插槽时,它也允许不同的行为,从而允许您确定呼叫行为。
您可以使用SetFoo(std::shared_ptr<Foo> ptr)
等方法注册Subscriber
,并使用std::condition_variable
在应调用回调时通知Subscriber
对象。但是其他线程将被阻止,直到从发布者线程通知条件变量。
相关文章:
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- libevent是否允许在不同的线程中运行timer/io的回调
- C++ 线程端回调并返回结果
- 如何调用来自不同线程的回调?
- 限制空闲事件的回调率,而无需阻止线程而无需多线程
- 来自C 线程的节点FFI回调
- 线程池的计时测试:单线程 vs 回调 tp vs 未来 tp
- 复制文件时如何调用取消?(使用复制文件 ex 函数和复制进度例程回调函数)
- 从TLS回调中获取线程信息
- Openssl 线程安全回调函数注册,包括直接调用和间接调用
- 在状态栏上显示来自不同线程中回调的消息
- 在用户模式下从另一个进程回调,没有额外的线程
- Boost异步主线程回调
- 如何在C++中的原始线程中执行回调
- 从多线程C++插件回调NodeJS Javascript函数
- 哪个线程调用windows proc回调函数
- 有关回调函数和线程的一般查询
- 通过JNI从本机线程回调时Java线程泄漏
- 线程中的回调函数
- 当从线程池调用时,boost 的io_service是否共享请求的线程?