梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
Monitor。Wait��elements�察�1000��
Loop
items = elements。ToArray�┌�
Monitor。Exit��elements��
Dim item As Integer
For Each item In items
Console。WriteLine�─�Item �──�& item & ;��;��
Thread。Sleep��1000��
Next
End Sub
Sub Task2�┌�
Monitor。Enter��elements��
elements。Add��30��
Monitor。Pulse��elements��
Monitor。Exit��elements��
End Sub
The bolded code lines are the new pieces that use the Monitor type。 In the definition of the
first thread to get the lock�察�the Monitor。Enter�┌� method is called with the parameter elements�察 �
which�察�as in the earlier SyncLock example�察�defines the lock reference handle。 Once the lock has
been acquired�察�the thread checks to see if the list count is greater or equal to 3。 If the counter is
less than 3�察�the Monitor。Wait�┌� method is called。 The behavior of Monitor。Wait�┌� is similar to
Thread。Sleep�┌��察�except that the Monitor lock is given up。
Releasing the lock is a unique feature of a Monitor。 The lock is given up only during the
time that the caller is in Monitor。Wait�┌�。 When the Monitor。Wait�┌� method returns�察�the lock is
acquired again。 The code says that the thread is reawakened after 1 second。 After that second�察 �
the thread does not have the lock and needs to wait before it can acquire the lock。 If another
thread is holding onto the lock for a long time�察�it could take a while to get the lock back again。
Another way for the Monitor。Wait�┌� method to awaken is if a signal is sent by another
thread。 The code for the second thread uses Enter�┌� and Exit�┌��察�but also Pulse�┌�。 The Monitor。
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 ha