梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
Pulse�┌� method triggers a signal that awakens the first thread�察�but the first thread will execute
only after the second thread has released control of the lock。
The big advantages of a Monitor in parison to SyncLock are that the Monitor can be
used anywhere in the code and that the Monitor will release a lock while waiting for an answer。
You would use SyncLock when you want to control access to a block of code。 If the access goes
beyond method boundaries�察�then it is preferable to use Monitor。 It is not that you could not use
a SyncLock that spanned boundaries�察�but if you need to add code that could produce a dead
lock�察�it is easier to control that code using a Monitor。
Now that we¨ve covered the fundamentals of multithreading�察�the next sections focus on
more advanced threading architectures!reader/writer and producer/consumer!and using
asynchronous calls。
´´´´´´´´´´´´´´´´´´´´´´Page 381´´´´´´´´´´´´´´´´´´´´´´´
C HA P TE R 1 3 * L E AR N IN G AB O U T M U L T IT HR E AD IN G 359
Implementing a Reader/Writer
Threaded Architecture
The reader/writer threaded architecture is based on the idea that if one thread is reading and
another thread would like to read as well�察�why not let it�拭�However�察�if one thread wants to write�察 �
then only that thread can write。 In other words�察�multiple threads are allowed to read data
simultaneously�察�but to write�察�a thread must have an exclusive lock。
implements a System。Threading。ReaderWriterLock class�察�which contains the reader/
writer functionality。 This class is like a Monitor�察�in that it gives you the control to manage how
data is accessed but does not determine what you are accessing。 The ReaderWriterLock type
has a number of methods and properties。 The most important ones are listed in Table 13´1。
Table 13´1。 Important ReaderWriterLock Methods
Method Description
AcquireReaderLock�┌� Acquires a reader lock。 Multiple threads can acquire a
reader lock。
AcquireWriterLock�┌� Acquires a writer lock。 Only a single thread can acquire
a writer lock。
DowngradeFromWriterLock�┌� Converts a writer lock into a reader lock。 Using this
method avoids the need to call ReleaseWriterLock�┌�
and AcquireReaderLock�┌�。
UpgradeToWriterLock�┌� Converts a reader lock into a writer lock。 Using this
method avoids the need to call ReleaseReaderLock�┌�
and AcquireWriterLock�┌�。
ReleaseLock�┌� Releases all locks�察�regardless how many times you have
called to acquire the reader or writer locks。
ReleaseReaderLock�┌� Decrements the reader lock a single count。 To pletely
release a reader lock�察�you need to make sure the number
of times you called ReleaseReaderLock�┌� is equal to the
number of times you called AcquireReaderLock�┌�。
ReleaseWriterLock�┌� Decrements the writer lock a single count。 To pletely
release a reader lock�察�you need to make sure the number
of times you called ReleaseWriterLock�┌� is equal to the
number of times you called AcquireWriterLock�┌�。
Let¨s look at a collection example that has four threads�此�three readers and one writer。 The
example uses Thread。Sleep�┌� strategically�察�so that you can see how a reader thread and writer
thread interact with each other。
Imports System。Threading
Friend Module TestMoreTopics
Private rwlock As New ReaderWriterLock�┌�
Private elements As New List��Of Integer���┌�
´´´´´´´´´´´´´´´´´´´´´´Page 382´´´´´´´´´´´´´´´´´´´´´´´
360 CH AP T E R 1 3 * L E A R N I N G A B OU T M U L T I TH R E A DI N G
Sub Task1�┌�
Thread。Sleep��1000��
Console。WriteLine�─�Thread 1 waiting for read lock;��
rwlock。AcquireReaderLock�─�1��
Console。WriteLine�─�Thread 1 has read lock;��
Dim item As Integer
For Each item In elements
Console。WriteLine�─�Thread 1 Item �──�& item & ;��;��
Thread。Sleep��1000��
Next
Console。WriteLine�─�Thread 1 releasing read lock;��
rwlock。ReleaseLock�┌�
End Sub
Sub Task2�┌�
Thread。Sleep��1250��
Console。WriteLine�─�Thread 2 waiting for read lock;��
rwlock。AcquireReaderLock�─�1��
Console。WriteLine�─�Thread 2 has read lock;��
Dim item As Integer
For Each item In elements
Console。WriteLine�─�Thread 2 Item �──�& item & ;��;��
Thread。Sleep��1000��
Next
Console。WriteLine�─�Thread 2 releasing read lock;��
rwlock。ReleaseLock�┌�
End Sub
Sub Task3�┌�
Thread。Sleep��1750��
Console。WriteLine�─�Thread 3 waiting for read lock;��
rwlock。AcquireReaderLock�─�1��
Console。WriteLine�─�Thread 3 has read lock;��
Dim item As Integer
For Each item In elements
Console。WriteLine�─�Thread 3 Item �──�& item & ;��;��
Thread。Sleep��1000��
Next
Console。WriteLine�─�Thread 3 releasing read lock;��
rwlock。ReleaseLock�┌�
End Sub
Sub Task4�┌�
Thread。Sleep��1500��
Console。WriteLine�─�Thread 4 waiting for write lock;��
rwlock。AcquireWriterLock�─�1��
Console。WriteLine�─�Thread 4 has write Lock;��
´´´´´´´´´´´´´´´´´´´´´´Page 383´´´´´´´´´´´´´´´´´´´´´´´
C HA P TE R 1 3 * L E AR N IN G AB O U T M U L T IT HR E AD IN G 361
elements。Add��30��
Console。WriteLine�─�Thread 4 releasing write lock;��
rwlock。ReleaseLock�┌�
End Sub
Private Sub ReaderWriter�┌�
elements。Add��10��
elements。Add��20��
Dim thread1 As New Thread��AddressOf Task1��
Dim thread2 As New Thread��AddressOf Task2��
Dim thread3 As New Thread��AddressOf Task3��
Dim thread4 As New Thread��AddressOf Task4��
thread1。Start�┌�
thread2。Start�┌�
thread3。Start�┌�
thread4。Start�┌�
End Sub
Public Sub RunAll�┌�
TestMoreTopics。ReaderWriter�┌�
End Sub
End Module
The bolded code contains all of the references to the reader/writer class imple
mentation。 Unlike the keyword SyncLock or the type Monitor�察�the ReaderWriterLock type is
instantiated and the instance is shared between threads。
The code to acquire a reader lock or writer lock has a parameter of value ´1�察�which means
to wait until the lock is acquired。 A positive value means to wait for a number of milliseconds�察�and
if the lock has not been acquired�察�then return from the method call。 If you do use a timeout�察�before
you attemp