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

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

梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��




          Thread 2 releasing read lock 

          Thread 4 has write Lock 

          Thread 4 releasing write lock 

          Thread 3 has read lock 

          Thread 3 Item ��10�� 

          Thread 3 Item ��20�� 

          Thread 3 Item ��30�� 

          Thread 3 releasing read lock 



               In the generated output�察�the sequence of events is as follows�此�



               1。  Thread 1 wants and acquires a read´only lock。 



               2。  Thread 1 outputs the first number in the collection。 Thread 1 then sleeps�察�which lets in  

                   another thread for execution。 



               3。  Thread 2 wants and acquires another read´only lock。 



               4。  Thread 2 outputs the first number in the collection。 Thread 2 then sleeps�察�which lets in  

                   another thread for execution。 



               5。  Thread 4 wants a writer lock and is kept on hold。 



               6。  Thread 3 wants a read´only lock�察�but because thread 4 has asked for a writer lock and is  

                   queued�察�thread 3 is put on hold。 At this step�察�threads 3 and 4 are put on hold and are  

                   waiting for the read´only locks of threads 1 and 2 to be released。 



               7。  Threads 1 and 2 output the remaining numbers in the collection。 



               8。  Threads 1 and 2 release the read´only locks。 



               9。  Thread 4 is given a writer lock�察�and thread 3 is still on hold。 



              10。  Thread 4 writes to the collection and releases the writer lock。 



              11。  Thread 3 acquires a read´only lock and iterates the individual numbers�察�including the  

                   number added by thread 4。 


´´´´´´´´´´´´´´´´´´´´´´Page 385´´´´´´´´´´´´´´´´´´´´´´´

                                                   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 363 



     Notice that the reader/writer lock makes the sequence of reading and writing events orderly�察 �

so that the shared state is always consistent。 The reader/writer lock does not hinder or stop  

deadlocks�察�which can occur if you are not careful with how you write your code。 The reader/ 

writer lock is concerned about only the code that is used to manage data。 



Implementing a Producer/Consumer Architecture 



The producer/consumer technique has never been defined as a type�察�but it is used throughout  

many multithreaded applications。 The idea behind a producer/consumer architecture is to  

split the problem into two parts。 One side is the producer of data�察�information�察�and tasks。 The  

producer wraps up the information into a task to be executed。 The other side is the consumer�察 �

and it is responsible for unwrapping the information and doing something with it。 



Using a Hidden Producer/Consumer Implementation 



In Windows GUIs�察�multithreaded applications are not allowed to access UI ponents if they  

are not the thread that created the UI element。 To get around that problem�察�the Windows。Forms  

library uses the Invoke�┌� method。 To demonstrate�察�we¨ll create a GUI application that uses another  

thread to periodically increment a counter that is displayed in a text box。 

     Follow these steps�此 �



     1。  Create a new Windows Forms application�察�and set it as the startup project if it isn¨t already  

         ��right´click its name and select Set as StartUp Project��。 



     2。  Drag a TextBox control onto Form1 in the design window。 



     3。  Select the TextBox control。 If the Properties window isn¨t visible�察�right´click the control  

         and select Properties。 



     4。  Change the TextBox¨s Name property to txtMessage。 



     5。  Right´click the form and select View Code。 



     6。  Add the following code。 



         Imports System。Threading 



         Public Class Form1 



             Private _counter As Integer 

             

             Private Sub IncrementCounter�┌� 

                 Me。txtMessage。Text = ;Counter �──�& _counter & ;��; 

                 _counter ��= 1 

             End Sub 



             Delegate Sub DelegateIncrementCounter�┌� 


´´´´´´´´´´´´´´´´´´´´´´Page 386´´´´´´´´´´´´´´´´´´´´´´´

364       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 



                       Private Sub PeriodicIncrement�┌� 

                           Do While True 

                               Invoke��New DelegateIncrementCounter��AddressOf IncrementCounter���� 

                               ' You can't call the GUI using a thread other than the GUI thread 

                               'IncrementCounter�┌� 

                               Thread。Sleep��1000�� 

                           Loop 

                       End Sub 

                       Private _thread As Thread 



                   End Class 



               7。  Switch back to the design view and double´click the form�察�which should take you back  

                   to the code view in the  Form1_Load�┌� method。 



               8。  Add the following code to the  Form1_Load�┌� method。 



                       Private Sub Form1_Load��ByVal sender As System。Object�察�_ 

                                              ByVal e As System。EventArgs�� Handles MyBase。Load 

                           _thread = New Thread��AddressOf PeriodicIncrement�� 

                           _thread。Start�┌� 

                       End Sub 



               When  Form1 is loaded�察�the  Form1_Load�┌� method is executed�察�which instantiates a new  

          thread�察�which then executes the  PeriodicIncrement�┌� method。 Within the implementation of  

          PeriodicIncrement�┌� is a never´ending loop�察�which calls the  Form。Invoke�┌� method�察�to which  

          we pass a delegate。 The delegate is the method  IncrementCounter�┌��察�which increments a  

          counter and outputs the result to the text box txtMessage。 

               From a user perspective�察�it would seem obvious to call the method In
卦指朕村 貧匯匈 和匯匈 指欺競何 壘��1�� 家��1��
隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
梁椣戻幣�� 梁心弌傍議揖扮窟燕得胎��傍竃徭失議心隈才凪万弌誌育断蛍�輌臆惨軼僑〃�燕慕得珊辛參資誼持蛍才将刮襲潜��範寔亟圻幹慕得 瓜寡追葎娼得辛參資誼寄楚署衛、持蛍才将刮襲潜填��