我可以在异步等待架构中的 c# 中使静态变量易失性吗?有什么优点和缺点?



我正在Winform c# 6.0中开发一个网络应用程序。使用异步等待体系结构的应用程序。在某些地方,我正在通过另一个类访问静态公共变量而不创建对象。我想知道声明静态变量易失性是否有任何缺点。

提前谢谢。

为什么我们使用易变性

快速内存是昂贵的。RAM的速度可以接受,但与CPU内部使用的内存相比,它甚至很慢。现代多核 CPU 具有多层内部缓存内存,越接近单个内核,速度就越快。

对于多线程应用程序,将单个更改从 L1 缓存一直传播到 L3,然后向上返回到所有其他 L1 缓存成为一个问题。因此,您可能会遇到一些问题,例如某些内核已获得更新的 L1 chache,但其他内核仍处于以前的值。硬件级别的争用条件。

还有一个部分,编译器、JiT 和运行时可以决定添加和删除临时变量,如果它被认为对性能有利。就像修剪同一索引的 2+ 次访问一样,将复制到临时变量的 1 次访问。或者将临时变量删除为"未充分利用"。因此,您最终会到处都是不可预测的过时值。

沃尔泰尔关闭了这一切。因此,您将不会从硬件、JiT、运行时或任何类似来源获得额外的比赛条件来源。然而,你仍然有种族条件的所有正常危险,所以它不是线程安全 - 只是它的一部分。

虽然你不需要它与异步/等待

async/await 被设计为实现多任务处理的无线程方式。因此,async/await 甚至不会遇到易失性试图解决的问题。

长期以来,"向它抛出线程"是用几乎所有语言完成多任务处理的最方便的方法。多线程只是与CPU绑定的工作非常复杂,但这是一种快速,肮脏和可靠的方法来完成Multtitasking。在单个线程中执行多问的代码冗长、复杂,并且对于人类程序员来说非常容易搞砸。async/await 让编译器和运行时为您处理管道,就像它们为您处理内存管理一样。有了这两个(以及其他语言的同胞(,我们终于可以停止过度使用多线程来完成多任务处理。

避免静电误用

静态通常被用作交换数据的简单方法。我的建议是只使用编译(const(和运行时(静态只读(常量中的静态。

我最接近与它交换数据的是使用一个需要实例化的类并将实例分配给静态字段。通过参数为实例提供代码,甚至不需要直接访问静态字段。

这样,至少我可以有多个实例,交换实现并执行直接访问静态字段永远不允许的其他事情。

最新更新