【发布时间】:2021-08-25 19:27:52
【问题描述】:
我有一个相对简单的案例:
- 我的程序将通过 Websockets 接收更新,并将使用这些更新来更新它的本地状态。这些更新将非常小(通常
- 同时,程序将从该本地状态读取/评估并输出其结果。
- 这两个任务应该并行运行,并将在程序的持续时间内运行,即永不停止。
- 本地状态大小相对较小,因此内存使用不是一个大问题。
棘手的部分是更新需要“原子地”发生,这样它就不会从本地状态中读取,例如,只写入了一半的更新。状态不限于使用原语,并且可以包含任意类 AFAICT atm,因此我无法通过使用 Interlocked 原子操作之类的简单方法来解决它。我计划在自己的线程上运行每个任务,所以在这种情况下总共有两个线程。
为了实现这个目标,我想使用双缓冲技术,其中:
- 它保留两份状态副本,以便在写入另一份的同时读取一份。
- 线程可以通过使用锁来传达它们正在使用的副本。即写入器线程在写入时锁定副本;阅读器线程在完成当前副本后请求访问锁定; writer 线程看到 reader 线程正在使用它,因此它切换到其他副本。
- 编写线程跟踪它在当前副本上完成的状态更新,因此当它切换到另一个副本时,它可以“赶上”。
这是这个想法的一般要点,但实际的实现当然会有点不同。
我试图查找这是否是一个常见的解决方案,但实际上找不到太多信息,所以这让我想知道类似的事情:
- 它是否可行,还是我遗漏了什么?
- 有更好的方法吗?
- 这是一个通用的解决方案吗?如果有,通常称为什么?
- (奖励)我可以阅读与此相关的主题的好资源吗?
几乎我觉得我遇到了一个死胡同,我找不到(因为我不知道要搜索什么)更多的资源和信息来看看这种方法是否“好”。我计划用 .NET C# 编写这个,但我认为这些技术和解决方案可以翻译成任何语言。对所有见解表示赞赏。
【问题讨论】:
-
本地状态是mutable or immutable吗?
标签: c# multithreading concurrency parallel-processing multiprocessing