如何解决当涉及高速网络消息传递时,使用易失性字典是一个不错的选择吗?
前提
我正在开发一款多人游戏,我有许多网络控制的角色,我决定将女巫的输入存储在一个易变的字典中:
public static volatile Dictionary<string,QuickMessage> quickPlayerMessages;
并且每一帧演员都从该字典中获取他们的值,但与此无关,我还有一个接收器线程不断更新该字典,因此值会不断更改,并且键可能会被删除或添加到其中。我做了一些测试,这有效,但是...
我的担忧
我不完全理解 volatile 修饰符,我知道它应该消除一些可能导致读取部分写入信息的优化。我还听说这并不像使用锁定机制那样真正起作用。虽然我确实选择了这个解决方案,因为它为我减少了很多复杂性,而且看起来它的响应速度相当快(速度方面),但我确实对此感到不安。
这种方法是否有可能出现或我应该注意的问题?
解决方法
def get(self,request,pk):
A = Object.objects.get(pk=pk)
childs = A.parents.all()
X = []
while childs:
newchilds = []
for c in childs:
if c.type_of_trakt.name == 'ПГ':
X.append(c)
newchilds += c.parents.all()
childs = newchilds
serializer = PGListSerializer(X,many=True).data
return Response(serializer)
可能不是正确的方法。 volatile 的作用是强制从内存而不是缓存中读取值。读取或写入引用或小于 IntPtr 的值在 c# 中是原子的。但是如果没有某种内存屏障,该值可以被缓存,并且一个线程上的更改可能对其他线程不可见。 Volatile 插入了一些内存屏障来解决一些可见性问题。
在这种情况下,您似乎没有替换字典,因此 volatile
什么也不做。但是,您提到您正在更新字典。这不是没有锁的线程安全。但是您可以考虑使用 ConcurrentDictionary<TKey,TValue>
代替。然而,并发字典只能保证字典本身是线程安全的,您仍然需要考虑程序的整体线程安全性。
另外,你最关心的应该是程序是否正确,速度是次要的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。