フォローアップthis post。私の目標は、一度に1つだけの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
を再計算するときによく使用されます。だから私の質問は、これらの2つのラインの安全性についてです:
SyncLock Lock
Threading.Thread.MemoryBarrier()
それは私がメインで実行されているコードでこれらを呼び出す場合、何が起こるかthe documentationに私には明らかではありません。私はコードを追加しましたが、それは正常に実行されるようですが、私は自分がAbortのような別の問題に開かれていないことを確認したいと思います。これらはスレッド化と非スレッド化の両方で使用できますか?
「スレッド」という用語は「実行のスレッド」の略で、すべてがスレッドなので、「シングルスレッドを使用しないプログラムの場合は「スレッド」となります。 'main'自体はスレッド内で実行されますが、単にスレッドのみであり、特別な作業はありません。すべてのプロセスにデフォルト/初期スレッドがあります。 – kfsone
確かに、*同期*ロックは*同期スレッド用です。スレッドが1つしかない場合、*同期するものは何もありません。したがって、私の質問。 –