Mega Code Archive

 
Categories / VB.Net Tutorial / Thread
 

Producer and consumer with synchronization mechanisms

Imports System.Threading Module Tester    Sub Main()       Dim holdInteger As New Buffer()       Dim producer As New Producer(holdInteger)       Dim consumer As New Consumer(holdInteger)       Dim producerThread As New Thread(AddressOf producer.Produce)       Dim consumerThread As New Thread(AddressOf consumer.Consume)       producerThread.Name = "Producer"       consumerThread.Name = "Consumer"       producerThread.Start()       consumerThread.Start()    End Sub End Module  Public Class Producer    Private buffer As Buffer    Public Sub New(ByVal sharedObject As Buffer)       buffer = sharedObject    End Sub ' New    Public Sub Produce()       Dim count As Integer       For count = 1 To 4          Thread.Sleep(4000)          buffer.Buffer = count       Next       Console.WriteLine(Thread.CurrentThread.Name & _          " done producing." & vbCrLf & "Terminating " & _          Thread.CurrentThread.Name & ".")    End Sub  End Class  Public Class Consumer    Private buffer As Buffer    Public Sub New(ByVal sharedObject As Buffer)       buffer = sharedObject    End Sub ' New    Public Sub Consume()       Dim count, sum As Integer       For count = 1 To 4          Thread.Sleep(300)          sum += buffer.Buffer       Next       Console.WriteLine(Thread.CurrentThread.Name & _          " read values totaling: " & sum & "." & vbCrLf & _          "Terminating " & Thread.CurrentThread.Name & ".")    End Sub  End Class Public Class Buffer    Private mBuffer As Integer = -1    Private occupiedBufferCount As Integer    Public Property Buffer() As Integer       Get          Monitor.Enter(Me)          If occupiedBufferCount = 0 Then             Console.WriteLine("Buffer empty. " & _                Thread.CurrentThread.Name & " waits.")             Monitor.Wait(Me)          End If          occupiedBufferCount -= 1          Console.WriteLine(Thread.CurrentThread.Name & " reads " & _             mBuffer)          Monitor.Pulse(Me)          Dim bufferCopy As Integer = mBuffer          Monitor.Exit(Me)          Return bufferCopy       End Get       Set(ByVal Value As Integer)          Monitor.Enter(Me)          If occupiedBufferCount = 1 Then             Console.WriteLine("Buffer full. " & _                Thread.CurrentThread.Name & " waits.")             Monitor.Wait(Me)          End If          mBuffer = Value          occupiedBufferCount += 1          Console.WriteLine(Thread.CurrentThread.Name & " writes " & _             mBuffer)          Monitor.Pulse(Me)          Monitor.Exit(Me)       End Set    End Property ' Buffer End Class Buffer empty. Consumer waits. Producer writes 1 Consumer reads 1 Buffer empty. Consumer waits. Producer writes 2 Consumer reads 2 Buffer empty. Consumer waits. Producer writes 3 Consumer reads 3 Buffer empty. Consumer waits. Producer writes 4 Consumer reads 4 Consumer read values totaling: 10. Terminating Consumer. Producer done producing. Terminating Producer.