< Day Day Up > |
The .NET Framework allows programs to execute across multiple threads of execution. A full discussion of multithreading is beyond the scope of this book, but there is a statement that helps simplify writing multithreaded applications. The SyncLock statement can be used to prevent more than one thread of execution from entering the same block of code. For example, the following code creates two threads to fill an array. Imports System.Threading Module Test Dim Array(10000) As Integer Dim CurrentIndex As Integer = 0 Sub FillArray() For Number As Integer = 1 to 5000 Array(CurrentIndex) = Number CurrentIndex += 1 Next Number End Sub Sub Main() Dim t1 As Thread = New Thread(AddressOf FillArray) Dim t2 As Thread = New Thread(AddressOf FillArray) t1.Start() t2.Start() End Sub End Module The way this code is written, the array may or may not be completely filled when the program finishes executing. If thread 1 assigns a value into a particular index, it is possible that thread 2 will read the value of CurrentIndex before thread 1 has a chance to increment the value in the variable. Thus, thread 2 will then overwrite the value that thread 1 wrote, instead of using a new index. The SyncLock statement uses an object as a signal to prevent more than one thread of execution from entering the protected block at a time. The preceding example can be rewritten as follows , using a SyncLock statement to prevent more than one thread from updating the array at one time. Imports System.Threading Module Test Dim Array(10000) As Integer Dim CurrentIndex As Integer = 0 Sub FillArray() SyncLock Array.SyncRoot For Number As Integer = 1 to 5000 Array(CurrentIndex) = Number CurrentIndex += 1 Next Number End SyncLock End Sub Sub Main() Dim t1 As Thread = New Thread(AddressOf FillArray) Dim t2 As Thread = New Thread(AddressOf FillArray) t1.Start() t2.Start() End Sub End Module The argument to a SyncLock statement can be an instance of any reference type ”in this example, the SyncLock statement uses the value returned by System.Array.SyncRoot as the signal. All SyncLock blocks that use the same instance will block each other, so care must be used when you are choosing what instance to use to block.
|
< Day Day Up > |