0

应用上下文如下:

  1. 它是一个单进程多线程程序
  2. 它专为自动期货交易而设计。在期货交易市场中,有数百个活跃的期货合约。每份合约的市场数据称为分时数据,每 500 毫秒从 Future-Exchange 推送一次。每个自动期货交易策略都作为一个线程运行。每个策略都需要不同合约的实时市场数据。例如:策略A需要合约A1、合约A2、合约A3的行情数据。策略B需要合约A1、合约B1和合约B2的行情数据。
  3. 该程序中的一个线程作为市场数据接收器运行,它接收所有合约的市场数据并将它们保存在数据缓冲区中,交易后可以将其保存到磁盘数据库中。因此,这个线程可以作为数据生产者进行审查,而策略线程可以作为数据消费者进行审查。所以这个场景是一个单生产者多消费者的问题。设计必须确保所有策略线程都能有效地获取他们需要的分时数据。
  4. 一种可能的设计是:所有消费者都等待一个条件变量并尝试获取共享锁。当一个新的tick到来时,单个生产者会尝试获得一个排他锁并将这个tick数据保存到数据缓冲区中。然后它用条件变量通知所有消费者。当通知消费者时,它会检索数据缓冲区以查看它需要的合约数据是否更新(通过比较时间戳)。如果不是,它将再次等待条件变量。但是这种低效率的设计,每一个新的到来的tick数据都会导致所有的消费者醒来并检索数据缓冲区(检索的过程可能很耗时)无论消费者是否需要数据。
  5. 一个改进的设计是:定义一个全局变量来存储新来的分时数据。当有新的分时数据到来时,生产者将更新全局变量并将分时数据存储到数据缓冲区中,然后通知所有消费者。消费者醒来,只需检查全局变量以查看刻度数据是否符合他们的需要(无需检索整个数据缓冲区)。但问题是存在一些竞争条件。可能在消费者获得共享锁之前,另一个新的滴答数据到来,生产者提前获得锁并更新全局变量。所以消费者会错过一个滴答数据。有更好的设计吗?(比如用unix domain socket来广播?不知道unix domain socket是否可以在多线程之间应用,如果可以,对比共享内存效率如何?)
4

0 回答 0