sách gpt4 ai đã đi

Chia sẻ biến đúng cách giữa các luồng (.NET/VB.NET)

In lại 作者:行者123 更新时间:2023-12-03 13:16:01 29 4
mua khóa gpt4 Nike

我阅读了很多不同的博客和 StackOverflow 问题,试图找到我的问题的答案,但最后我找不到任何东西,所以我想自己问这个问题。

我正在构建一个应用程序,其中有一个长时间运行的工作线程,它执行一些操作并将一些结果放入变量中。工作线程不断工作并不断产生一些结果,因此我只对结果的“当前”值感兴趣。在某些时候,另一个线程将获取工作线程运行的“当前”结果并用它做一些事情。

此类工作线程的简单实现可以如下完成:

Public Class Worker

Private _result As DateTimeOffset?

Public ReadOnly Property Result As DateTimeOffset?
Get
Return _result
End Get
End Property


Public Sub ThreadMethod()
' Do something
_result = x
' .
' .
_result = y
' .
' .
' etc
End Sub

End Class

现在假设我有一个消费者想要消费结果:

Public Class Consumer

Private _worker As Worker

Public Sub Consume()
Dim result As DateTimeOffset?
While True
' Do some work on your own
' .
' .
' Get current result
result = _worker.Result
' Do something with result

End While
End Sub

End Class

据我了解编译器的工作原理,编译器可以使 Property Result 内联,然后将 _result 变量优化到寄存器中,这似乎是合乎逻辑的一遍又一遍地读取相同的值。在 C# 中,我可以将结果标记为 volatile ,这(我认为)会阻止此类优化,但 VB.NET 中不存在该关键字。我能想到的最接近的解决方案是使用 Volatile.Write 和 Volatile.Read 方法。但是,这些方法不能与 Nullable(Of DateTimeOffset) 一起使用。

注1:虽然这个问题似乎与弱/强内存模型和内存屏障的使用有关,但我不认为它们在这种情况下有任何影响。话虽这么说,如果有人说 Thread.MemoryBarrier() 会强制从内存中进行读/写,那么这对我来说也是一个足够好的解决方案。

注2:我知道还有其他方法可以解决该问题,但我想知道该解决方案对于所描述的场景是否可行(如果问题存在,我什至不确定)。

1 Câu trả lời

sử dụngThread.MemoryBarrier仅确保该线程中内存访问的顺序。您拥有的是访问同一变量的两个线程,因此您需要更多的保护。

该变量不是原子的,因此如果您不同步访问,您可能最终会读取部分写入的值。您可以为属性创建同步的 getter 和 setter,然后在工作线程中使用 setter 来设置值,而不是设置后备变量。

Private _result As DateTimeOffset?
Private _sync as New Object()

Public Property Result As DateTimeOffset?
Get
SyncLock _sync
Return _result
End SyncLock
End Get
Set(ByVal value as dateTimeOffset?)
SyncLock _sync
_result = Value
End SyncLock
End Set
End Property

关于.net - 在线程之间正确共享变量 (.NET/VB.NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29162694/

29 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com