Imports System.Threading
Module Module1
Sub Main()
SyncLockMultiThreadComputation(10, 0)
End Sub
Public Class ThreadTestUtilities
Public Function Compute(ByVal InputValue As Double) As Double
Dim DoubleOutputValue As Double
Dim DateTimeNow As DateTime
Dim rndNumberGenerator As System.Random
DateTimeNow = New DateTime(DateTime.Now.Ticks)
rndNumberGenerator = New System.Random(DateTimeNow.Hour + DateTimeNow.Minute + DateTimeNow.Millisecond)
If DateTimeNow.Millisecond > 500 Then
DoubleOutputValue = System.Math.IEEERemainder(System.Math.Exp(rndNumberGenerator.Next * (InputValue + 5000) * System.Math.E), rndNumberGenerator.Next)
Else
DoubleOutputValue = rndNumberGenerator.Next(InputValue) / System.Math.Max(Double.MaxValue - 1, System.Math.Log(System.Math.Pow(System.Math.PI, InputValue)))
End If
DateTimeNow = Nothing
rndNumberGenerator = Nothing
Return DoubleOutputValue
End Function
Public Sub SingleThreadComputation(ByVal Iterations As Integer)
Dim IntegerIterationCounter As Integer
For IntegerIterationCounter = 1 To Iterations
Compute(Double.Parse(IntegerIterationCounter))
Next
End Sub
End Class
Public Class SyncLockThreadWorker
Public Shared objStorageLock As New Object
Public Shared objCompletedComputationsLock As New Object
Public Shared objRunningThreadsLock As New Object
Public Shared IntegerCompletedComputations As Integer = 0
Public Shared iRunningThreads As Integer = 0
Private Shared DoubleStorage As Double
Public Property Storage() As Double
Get
SyncLock objStorageLock
Return DoubleStorage
End SyncLock
End Get
Set(ByVal value As Double)
SyncLock objStorageLock
DoubleStorage = value
End SyncLock
End Set
End Property
Public Property CompletedComputations() As Integer
Get
Return IntegerCompletedComputations
End Get
Set(ByVal value As Integer)
IntegerCompletedComputations = value
End Set
End Property
Public Shared Property RunningThreads() As Integer
Get
Return iRunningThreads
End Get
Set(ByVal value As Integer)
iRunningThreads = value
End Set
End Property
Public Sub ThreadProc(ByVal StateObject As Object)
Dim ttuComputation As ThreadTestUtilities
ttuComputation = New ThreadTestUtilities
Storage = ttuComputation.Compute(CDbl(StateObject))
SyncLock objCompletedComputationsLock
Thread.Sleep(3000)
CompletedComputations += 1
End SyncLock
SyncLock objRunningThreadsLock
RunningThreads -= 1
End SyncLock
ttuComputation = Nothing
End Sub
Public Shared Sub IncrementRunningThread()
SyncLock objRunningThreadsLock
RunningThreads += 1
End SyncLock
End Sub
Public Sub New()
End Sub
End Class
Public Sub SyncLockMultiThreadComputation(ByVal Iterations As Integer, Optional ByVal ThreadCount As Integer = 0)
Dim twSyncLock As SyncLockThreadWorker
Dim IntegerIterationCounter As Integer
Dim iOriginalMaxThreads As Integer
Dim iOriginalMinThreads As Integer
Dim iOriginalMaxIOThreads As Integer
Dim iOriginalMinIOThreads As Integer
Dim maxNumberOfRunningThreads As Integer = 2
twSyncLock = New SyncLockThreadWorker
Threading.ThreadPool.GetMaxThreads(iOriginalMaxThreads, iOriginalMaxIOThreads)
Threading.ThreadPool.GetMinThreads(iOriginalMinThreads, iOriginalMinIOThreads)
If ThreadCount > 0 Then
Threading.ThreadPool.SetMaxThreads(ThreadCount, ThreadCount)
Threading.ThreadPool.SetMinThreads(ThreadCount, ThreadCount)
End If
SyncLockThreadWorker.iRunningThreads = 0
While SyncLockThreadWorker.IntegerCompletedComputations < Iterations
'For IntegerIterationCounter = 1 To Iterations
While SyncLockThreadWorker.iRunningThreads < maxNumberOfRunningThreads
SyncLockThreadWorker.IncrementRunningThread()
Threading.ThreadPool.QueueUserWorkItem(AddressOf twSyncLock.ThreadProc, Double.Parse(IntegerIterationCounter))
End While
'Next
End While
While SyncLockThreadWorker.IntegerCompletedComputations < Iterations AndAlso SyncLockThreadWorker.iRunningThreads > 0
End While
Threading.ThreadPool.SetMaxThreads(iOriginalMaxThreads, iOriginalMaxIOThreads)
Threading.ThreadPool.SetMinThreads(iOriginalMinThreads, iOriginalMinIOThreads)
twSyncLock = Nothing
IntegerIterationCounter = Nothing
End Sub
End Module