跟進this post。我的目標是隻有一個Calculate
的時間,所以我增加了一個爲SyncLock:即使您不在單獨的線程中,調用SyncLock和MemoryBarrier是否安全?
Public Sub Calculate(Optional inBack As Boolean = True)
If Not inBack Then
InternalCalculate(-1, False)
Else
If CalcThread IsNot Nothing Then
CalcThread.Abort() ' yes, I will replace this
CalcThread = Nothing ' XXX
End If
If CalcThread Is Nothing Then
CalcThread = New Threading.Thread(AddressOf InternalCalculate)
CalcThread.IsBackground = True
End If
CalcThread.Start()
End If
End Sub
Private Sub InternalCalculate(Optional Line As Integer = -1, Optional isBack As Boolean = True)
Dim Lock As New Object
SyncLock Lock
Threading.Thread.MemoryBarrier() ' do this BEFORE a write, right?
isRunning = true
'do the expensive stuff
End SyncLock
End Sub
注意isBack
。如果這是錯誤的,代碼應該在main中運行。當重新計算單個Line
時,通常使用這種方法。所以我的問題是關於這兩條線路的安全:
SyncLock Lock
Threading.Thread.MemoryBarrier()
這是我不清楚在the documentation如果我在代碼中的主力跑調用這些會發生什麼。我已經添加了代碼,它似乎運行正常,但我想確保我不打開自己到另一個陷阱,如Abort。對於線程和非線程使用都可以嗎?
術語'thread'是'執行線程'的簡稱,簡而言之,一切都是一個線程,因此術語「單線程「爲不使用線程的程序。 'main'本身在一個線程中運行,它可能僅僅是* only *線程,並沒有任何特殊的工作。每個進程都有一個默認/初始線程。 – kfsone
當然,一個* Sync *鎖定用於*同步*線程。如果只有一個線程,則不需要*同步*。因此我的問題。 –