加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

VB.NET:如果我总是用Thread.MemoryBarrier()完成我的写操作,我

发布时间:2020-12-17 07:28:28 所属栏目:百科 来源:网络整理
导读:VB.Net没有等效的C#volatile关键字,因此您必须手动实现volatile,这通常通过在读取之前和写入之后调用Thread.MemoryBarrier()来完成.所以这样的东西等同于声明C#volatile变量: ''' summary ''' Gets a value indicating whether this instance is disposed.
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(),以便为每次读取删除内存栅栏的成本.

解决方法

您无法移除读取侧的屏障,这可以通过示例轻松显示.让我们用这个读者:

while (!IsDisposed); //reads _isDisposed

_isDisposed的值可以清楚地缓存在这里的寄存器中,以便新的写入永远不会变得可见.这个循环可以是无限的(例如 – 其他影响是可能的,例如长延迟).

更正式地说,_isDisposed的读取都可以及时“向上”移动,以便在商店发生之前运行. volatile商店会影响释放栅栏,这意味着以后什么都不能移动它们.但是,事情可以转移到以前的时间点.

使用Volatile类.或者,使用C#编写的结构作为字段的包装:

struct VolatileInt32Box { public volatile int Value; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读