【发布时间】:2026-01-15 19:55:02
【问题描述】:
VB.Net 没有等效的 C# volatile 关键字,因此您必须手动实现 volatile,这通常通过在读取之前和写入之后调用 Thread.MemoryBarrier() 来完成。所以这样的事情相当于声明 C# volatile 变量:
''' <summary>
''' Gets a value indicating whether this instance is disposed.
''' </summary>
Public Property IsDisposed As Boolean
Get
Threading.Thread.MemoryBarrier()
Return _isDisposed
End Get
Private Set(value As Boolean)
_isDisposed = value
Threading.Thread.MemoryBarrier()
End Set
End Property
如果我写入变量的唯一位置是通过 setter 并且我总是在写入后调用 Thread.MemoryBarrier(),那么我想知道读取之前的内存屏障是必要的。
我可以在阅读之前安全地删除 Thread.MemoryBarrier() 吗?
编辑:为了更清楚,我问我是否可以在读取之前删除 Thread.MemoryBarrier() 以消除每次读取的内存栅栏成本。
【问题讨论】:
-
Volatileclass 应该可以在 VB.net 中工作,Thread类包含像VolatileRead这样的方法 -
问题是我可以在读取之前安全地删除 Thread.MemoryBarrier() 以避免读取时可能不必要的内存栅栏成本。
-
我敢肯定,如果你删除它,你会得到陈旧的读取。
-
您无法删除它。顺便说一句,当您问这个问题时,您不太可能正确使用它。 Read this.
-
那么这里的互联网有点冲突。请看:albahari.com/threading/part4.aspx(摘录:Thread 类中的静态 VolatileRead 和 VolatileWrite 方法在执行 volatile 关键字的保证(从技术上讲,是其超集)时读/写变量。不过,它们的实现效率相对较低,因为它们实际上会生成完整的栅栏)
标签: .net vb.net multithreading thread-safety memory-model