当涉及高速网络消息时,使用易失性字典是一个好选择吗



前提

我正在开发一款多人游戏,我有很多网络控制的参与者,我决定将女巫的输入存储在一个不稳定的字典中:

public static volatile Dictionary<string, QuickMessage> quickPlayerMessages;

每一帧演员都会从字典中获取他们的值,但与此无关,我还有一个接收器线程,它会不断更新字典,所以值会不断更改,密钥可能会被删除或添加到其中。我做了一些测试,这很有效,但。。。

我的担忧

我不完全理解volatile修饰符,我知道它应该消除一些可能导致读取部分写入的信息的优化。我还听说,这并不像你用锁机制做的那样真正起作用。虽然我确实选择了这个解决方案,因为它为我减少了很多复杂性,而且看起来响应速度相当快,但我确实对此感到不安

这种方法是否会产生任何问题,或者我应该意识到这些问题?

volatile可能不是正确的方法。volatile的作用是强制从内存中读取值,而不是从缓存中读取。读取或写入引用或小于IntPtr的值在c#中是原子性的。但是,如果没有某种内存屏障,则可以缓存该值,并且一个线程上的更改可能对其他线程不可见。Volatile插入一些内存屏障来解决一些可见性问题。

在这种情况下,您似乎没有替换字典,因此volatile将不起任何作用。然而,你提到你正在更新字典。如果没有锁,这是不安全的。但是,您可能会考虑使用ConcurrentDictionary<TKey, TValue>。然而,并发字典只能保证字典本身是线程安全的,您仍然需要考虑程序的整体线程安全性。

此外,你主要关心的应该是程序是否正确,速度是次要的。

最新更新