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