我有一个比较简单的应用场景:
- 我的程序将通过Websockets接收更新,并使用这些更新来更新其本地状态。这些更新非常小(通常是< 1-1000字节JSON,所以< 1ms进行反序列化),但非常频繁(高达〜1000/s)。
- 同时,该程序将从本地状态读取/评估并输出其结果。
- 这两个任务都应该并行运行,并将持续运行整个程序的时间,即永远不会停止。
- 本地状态的大小相对较小,因此内存使用量不是一个大问题。
棘手的部分在于更新需要“原子”发生,这样它就不会从本地状态中读取例如仅写入了一半更新的本地状态。根据我目前的了解,状态不受原语限制,可能包含任意类,因此我无法通过像使用Interlocked
原子操作这样简单的方法来解决它。我计划在自己的线程上运行每个任务,因此在这种情况下总共有两个线程。
为了实现这个目标,我想使用双缓冲技术,其中:
- 它保留两份状态副本,以便可以在写入另一个副本时从一个副本中读取。
- 线程可以通过使用锁来通信它们正在使用哪个副本。即,写入线程在写入时锁定副本;读取线程在完成当前副本后请求访问锁;写入线程看到读取线程正在使用它,因此会切换到其他副本。
- 写入线程跟踪其对当前副本所做的状态更新,因此当它切换到另一个副本时,它可以“追赶上来”。
这就是想法的一般要点,但实际实现当然会有所不同。
我尝试查找是否存在常见解决方案,但并没有找到太多信息,所以让我想到了一些问题:
- 这是可行的,还是我遗漏了什么?
- 是否有更好的方法?
- 这是常见的解决方案吗?如果是,通常称为什么?
- (额外加分)是否有一些相关主题的好资源可供阅读?
基本上,我感觉自己已经遇到了瓶颈,无法找到更多资源和信息,以查看这种方法是否“好”。我计划在.NET C#中编写此代码,但我认为这些技术和解决方案可以转换为任何语言。欢迎提供任何见解。