嗔秤戻幣�哉膵�云利匈嬉蝕湊蛸賜�塋床四衲���萩晦編報炎嘔囚^泡仟 ̄云利匈�《超噌�殻窟�嵌虜隆輓麈觚翹瀘卉韮�仍仍�。� 烏御危列
浪慕利 卦指云慕朕村 厘議慕尺 厘議慕禰 TXT畠云和墮 序秘慕杏 紗秘慕禰

VB2008貫秘壇欺娼宥(PDF鯉塀哂猟井)-及128嫗

梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 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
卦指朕村 貧匯匈 和匯匈 指欺競何 壘��0�� 家��0��
隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
梁椣戻幣�� 梁心弌傍議揖扮窟燕得胎��傍竃徭失議心隈才凪万弌誌育断蛍�輌臆惨軼僑〃�燕慕得珊辛參資誼持蛍才将刮襲潜��範寔亟圻幹慕得 瓜寡追葎娼得辛參資誼寄楚署衛、持蛍才将刮襲潜填��