当涉及高速网络消息传递时,使用易失性字典是一个好的选择吗?
Is the use of a volatile dictionary a good option when high speed network messaging is involved?
前提
我正在开发一款多人游戏,我有许多网络控制的演员, 的输入我决定存储在易失性字典中:
public static volatile Dictionary<string, QuickMessage> quickPlayerMessages;
演员在每一帧都从那个字典中获取他们的值,但独立于此我还有一个接收器线程不断更新那个字典,所以值不断地改变并且键可以被删除或添加到它。我做了一些测试,这很有效,但是...
我的担忧
我不完全理解 volatile 修饰符,我知道它应该消除一些可能导致读取部分写入信息的优化。我还听说这并不像使用锁定机制那样真正起作用。虽然我确实选择了这个解决方案,因为它为我减少了很多复杂性,而且看起来响应速度相当快(速度快),但我确实对此感到不安。
这种方法可能会出现什么问题或我应该注意什么?
volatile
可能不是正确的方法。 volatile 的作用是强制从内存而不是缓存中读取值。读取或写入引用或小于 IntPtr 的值在 C# 中是原子的。但是如果没有某种内存屏障,该值可以被缓存,并且一个线程上的更改可能对其他线程不可见。 Volatile 插入一些内存屏障来解决一些可见性问题。
在这种情况下,您似乎没有替换字典,因此 volatile
什么都不做。但是,您提到您正在更新字典。没有锁这不是线程安全的。但是您可能会考虑使用 ConcurrentDictionary<TKey, TValue>
代替。然而,并发字典只能保证字典本身是线程安全的,您仍然需要考虑程序的整体线程安全。
另外,您最关心的应该是程序是否正确,速度是次要的。
前提
我正在开发一款多人游戏,我有许多网络控制的演员, 的输入我决定存储在易失性字典中:
public static volatile Dictionary<string, QuickMessage> quickPlayerMessages;
演员在每一帧都从那个字典中获取他们的值,但独立于此我还有一个接收器线程不断更新那个字典,所以值不断地改变并且键可以被删除或添加到它。我做了一些测试,这很有效,但是...
我的担忧
我不完全理解 volatile 修饰符,我知道它应该消除一些可能导致读取部分写入信息的优化。我还听说这并不像使用锁定机制那样真正起作用。虽然我确实选择了这个解决方案,因为它为我减少了很多复杂性,而且看起来响应速度相当快(速度快),但我确实对此感到不安。
这种方法可能会出现什么问题或我应该注意什么?
volatile
可能不是正确的方法。 volatile 的作用是强制从内存而不是缓存中读取值。读取或写入引用或小于 IntPtr 的值在 C# 中是原子的。但是如果没有某种内存屏障,该值可以被缓存,并且一个线程上的更改可能对其他线程不可见。 Volatile 插入一些内存屏障来解决一些可见性问题。
在这种情况下,您似乎没有替换字典,因此 volatile
什么都不做。但是,您提到您正在更新字典。没有锁这不是线程安全的。但是您可能会考虑使用 ConcurrentDictionary<TKey, TValue>
代替。然而,并发字典只能保证字典本身是线程安全的,您仍然需要考虑程序的整体线程安全。
另外,您最关心的应该是程序是否正确,速度是次要的。