多线程观察者模式

shi*_*wla 6 c++ multithreading observer-pattern

我有一个问题,每次在不同的主题中更新主题.因此,每当主题被更新时,它相应地用新信息更新观察者.但是,如果观察者列表很长,则需要一些时间来更新所有观察者.想想一个经常更新的主题.当主题正在更新观察者时,"主题"对象被锁定,因此不能由不同的线程更新.这将为主题创建信息流量或导致信息丢失.

您是否知道如何在多线程环境中处理这些问题?另外,有人可以推荐一些关于C++并行编程的书吗?

Emi*_*ier 7

考虑使用生产者 - 消费者队列消息队列.对于您的示例,您可以通过两种方式使用队列:

  1. 对主题的更改已排队.当某些内容更新主题时,它会将新状态置于队列中并立即返回.这样,在通知观察者时,更新器不会阻塞.您将需要一个持续使状态更改出列并更新观察者的线程.

  2. 对观察员的通知排队.每个观察者都有一个队列,其中发布了主题状态更改通知.

如果您使用的是Qt库,则可以将信号和插槽机制与Qt :: QueuedConnection连接类型一起使用.插槽通过接收器的事件队列并在接收器的线程中执行.这样,当接收器执行它们各自的时隙时,发送器不会阻塞.

你的程序可能是Actor模型(范例)的一个很好的候选者.以下是一些实现actor模型的C++库:

您的程序也可能是Dataflow范例的良好候选者.查看提议的Boost Dataflow库,它支持线程.


我没有推荐的书,但请查看Herb Sutter 关于C++并发性的Dobbs博士系列文章.