VB.Net/Thread/Buffer
Circular Buffer Demo
<source lang="vbnet"> Imports System Imports System.Threading Public Class MainClass
Shared Sub Main() " create shared object Dim sharedLocation As New CHoldIntegerSynchronized() sharedLocation.CreateStateOutput() " Random object used by each thread Dim randomObject As New Random() " create CProducer and CConsumer objects Dim producer As New CProducer(sharedLocation, randomObject) Dim consumer As New CConsumer(sharedLocation, randomObject) " create threads Dim producerThread As New Thread(AddressOf producer.Produce) Dim consumerThread As New Thread(AddressOf consumer.Consume) " name threads producerThread.Name = "Producer" consumerThread.Name = "Consumer" " start threads producerThread.Start() consumerThread.Start() End Sub " Main
End Class Public Class CConsumer
Private sharedLocation As CHoldIntegerSynchronized Private randomSleepTime As Random " constructor Public Sub New(ByVal sharedObject As CHoldIntegerSynchronized, _ ByVal randomObject As Random) sharedLocation = sharedObject randomSleepTime = randomObject End Sub Public Sub Consume() Dim count, sum As Integer For count = 1 To 10 Thread.Sleep(randomSleepTime.Next(1, 3000)) sum += sharedLocation.Buffer Next Console.WriteLine( "Total " & _ Thread.CurrentThread.Name & " consumed: " & sum & vbCrLf & _ Thread.CurrentThread.Name & " terminated." ) End Sub
End Class Public Class CHoldIntegerSynchronized
Private mBuffer As Integer() = {-1, -1, -1} Private occupiedBufferCount As Integer Private readlocation, writeLocation As Integer Public Sub New() End Sub " New Property Buffer() As Integer Get SyncLock (Me) If occupiedBufferCount = 0 Then Console.WriteLine( "All buffers empty. " & _ Thread.CurrentThread.Name & " waits." ) Monitor.Wait(Me) End If Dim readValue As Integer = mBuffer(readlocation) Console.WriteLine( Thread.CurrentThread.Name & " reads " & _ mBuffer(readlocation) ) occupiedBufferCount -= 1 readlocation = (readlocation + 1) Mod mBuffer.Length CreateStateOutput() Monitor.Pulse(Me) Return readValue End SyncLock End Get Set(ByVal Value As Integer) SyncLock (Me) If occupiedBufferCount = mBuffer.Length Then Console.WriteLine( "All buffers full. " & _ Thread.CurrentThread.Name & " waits." ) Monitor.Wait(Me) End If mBuffer(writeLocation) = Value Console.WriteLine( Thread.CurrentThread.Name & " writes " & _ mBuffer(writeLocation) ) occupiedBufferCount += 1 writeLocation = (writeLocation + 1) Mod _ mBuffer.Length CreateStateOutput() Monitor.Pulse(Me) End SyncLock End Set End Property " Buffer Public Sub CreateStateOutput() Dim i As Integer Console.WriteLine( "(buffers occupied: " & _ occupiedBufferCount & ")" & vbCrLf & "buffers: " ) For i = 0 To mBuffer.GetUpperBound(0) Console.Write( " " & mBuffer(i) & " " ) Next For i = 0 To mBuffer.GetUpperBound(0) Console.Write( "---- " ) Next
For i = 0 To mBuffer.GetUpperBound(0) If (i = writeLocation AndAlso _ writeLocation = readlocation) Then Console.Write( " WR " ) ElseIf i = writeLocation Then Console.Write( " W " ) ElseIf i = readlocation Then Console.Write( " R " ) Else Console.Write( " " ) End If Next End Sub
End Class Public Class CProducer
Private sharedLocation As CHoldIntegerSynchronized Private randomSleepTime As Random Public Sub New(ByVal sharedObject As CHoldIntegerSynchronized, _ ByVal randomObject As Random) sharedLocation = sharedObject randomSleepTime = randomObject End Sub " New Public Sub Produce() Dim count As Integer For count = 11 To 20 Thread.Sleep(randomSleepTime.Next(1, 3000)) sharedLocation.Buffer = count Next Console.WriteLine( Thread.CurrentThread.Name & _ " done producing. " & vbCrLf & _ Thread.CurrentThread.Name & " terminated." ) End Sub
End Class
</source>