VB.NET中的易失性等效物

15

2
我可以问一下你为什么想知道吗?大多数人不会尝试在VB中编写无锁多线程算法。 - Eric Lippert
@EricLippert,不好意思如果我听起来有点无礼,但你为什么要问“你为什么想知道”呢?如果大多数人没有到达星辰的愿望 - 那些尝试的少数人应该停下来吗? 我个人在VB中进行了很多开发,并且可以说,这种语言远远领先于大多数语言。 - Dima
2
@Dima:因为当时我是C#设计团队的一员,并与VB设计团队保持日常联系。通过直接向真实用户征求反馈并确定他们在特定情境下的需求,我能够更有能力和准确地将这些用户需求表达给两种语言的设计团队同事。很高兴听到VB满足了您的需求;它是一种令人愉悦且独特的语言。 - Eric Lippert
@EricLippert 这是一门令人愉悦且古怪的语言,只适合新手使用。自1996年VB推出以来,大多数程序员都使用VB,然后渐渐转向VB.NET(自2002年起)。而这些程序员中的任何一个(包括我在内)都不明白为什么微软不能支持自己的专有RAPID技术。顺便说一下,我总是用VB编写无锁多线程代码。 - user18928007
3个回答

16

C#中的volatile关键字在VB.NET中没有相应的等效词。在C#中,volatile只是确保编译器在生成IL时处理事情的方式不同,但是VB.NET编译器没有此选项。

可以通过以下方法解决这个问题(摘自此博客文章):

Function VolatileRead(Of T)(ByRef Address As T) As T
    VolatileRead = Address
    Threading.Thread.MemoryBarrier()
End Function

Sub VolatileWrite(Of T)(ByRef Address As T, ByVal Value As T)
    Threading.Thread.MemoryBarrier()
    Address = Value
End Sub

我喜欢这个,谢谢。你有什么建议可以用于静态字段吗?例如像这样?当调用HttpClient类型字段的成员时,一个人会使用这些方法吗? - InteXX
这种方法已经过时了吗?还是有理由使用它来代替System.Thread.VolatileRead()和VolatileWrite()的方法? - Max Barraclough

14

1
现在每个人都应该使用System.Threading.Volatile对象,详情请见https://dev59.com/nmUp5IYBdhLWcg3wzp1k。 - Michael Erickson

2

根据您使用的变量类型,我建议使用

System.Threading.Thread.VolatileRead()

System.Threading.Thread.VolatileWrite()

此外,System.Threading.Interlocked 包含一些不错的东西...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接