如何调用来自不同线程的回调?

How to invoke callback from different threads?

本文关键字:线程 回调 何调用 调用      更新时间:2023-10-16

我有一个发布者-订阅者模式,其中发布者具有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对象。但是其他线程将被阻止,直到从发布者线程通知条件变量。