我试图围绕akka.net并发处理缓存一致性的方式来思考。假设我有一个Actor,它存储一些状态作为实例字段,我知道一次只处理一条消息。但是每个消息可能由线程池中不同的线程处理,可能在不同的核心/套接字上。 akka.net如何确保不同的线程看到对state字段所做的所有更改?
关于akka https://www.lightbend.com/blog/akka-and-the-java-memory-model的讨论有些相似,但是我不确定是否正确回答了缓存一致性问题(请参阅最后评论)。
最佳答案
在缓存一致性方面-一次仅在单个线程上读取参与者的状态(无论哪个线程正在处理参与者的邮箱),通常,参与者在将线程交给另一个线程之前一次要处理多达30条消息。演员。这类似于量子在常规Windows / Linux调度程序中的工作方式。
因此,您可以将actor内存的更新视为事务性的-两个处理器无法同时访问actor的内存,因为它是私有的,并且在给定时间只能由单个线程访问。这种高速缓存一致性的结果并不是一开始就存在的问题,因为参与者模型会强制对状态进行线性化的读取和写入历史记录。