Ein Nachfolger zu this post. Mein Ziel ist es nur eine Calculate
zu einer Zeit zu haben, so habe ich eine SyncLock hinzugefügt:Ist es sicher, SyncLock und MemoryBarrier aufzurufen, auch wenn Sie nicht in einem separaten Thread sind?
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
Notiere die isBack
. Wenn dies falsch ist, sollte der Code nur in main ausgeführt werden. Dies wird häufig verwendet, wenn ein einzelner Line
neu berechnet wird. Also meine Frage ist über die Sicherheit dieser beiden Linien:
SyncLock Lock
Threading.Thread.MemoryBarrier()
Es ist mir nicht klar, in the documentation, was passiert, wenn ich diese in Code ausgeführt wird in Haupt nennen. Ich habe den Code hinzugefügt, und es scheint zu laufen, OK, aber ich möchte sicherstellen, dass ich mich nicht zu einem anderen Gotcha öffne, wie Abort. Sind diese OK für beide Anwendungen mit und ohne Gewinde?
Der Begriff 'thread' ist die Abkürzung für' thread of execution' und kurz gesagt, alles ist ein Thread, daher der Begriff 'single threaded "für ein Programm, das keine Threads verwendet. 'main' selbst läuft in einem Thread, es kann einfach der * einzige * Thread sein und hat keine besondere Arbeit. Jeder Prozess hat einen Standard-Thread. – kfsone
Sicher, aber ein * Sync * Lock ist zum * Synchronisieren * Threads. Wenn es nur einen Thread gibt, gibt es nichts zu synchronisieren *. Also meine Frage. –