Try again

200512270453934121.gif

博客园 首页 联系 管理

 

using System;
using System.Threading;

namespace MultiThreadApplication
{
    
class Class1
    
{
        
private ReaderWriterLock rwl = new ReaderWriterLock();
        
private long myNumber;
        
public long Number   // the Number property
        {
            
get
            
{
                
//Acquire a read lock on the resource.
                rwl.AcquireReaderLock(Timeout.Infinite);
                
try
                
{
                    Console.WriteLine(
"Thread:{0} starts getting the Number", Thread.CurrentThread.GetHashCode());
                    Thread.Sleep(
50);
                    Console.WriteLine(
"Thread:{0} got the Number", Thread.CurrentThread.GetHashCode());

                }

                
finally
                
{
                    
//Release the lock.
                    rwl.ReleaseReaderLock();
                }

                
return myNumber;
            }

            
set
            
{
                
//Acquire a write lock on the resource.
                rwl.AcquireWriterLock(Timeout.Infinite);
                
try
                
{
                    Console.WriteLine(
"Thread: {0} start writing the Number", Thread.CurrentThread.GetHashCode());
                    Thread.Sleep(
50);
                    myNumber 
= value;
                    Console.WriteLine(
"Thread: {0} written the Number", Thread.CurrentThread.GetHashCode());
                }

                
finally
                
{
                    
//Release the lock.
                    rwl.ReleaseWriterLock();
                }

            }

        }


        [STAThread]
        
static void Main(string[] args)
        
{
            Thread[] threadArray 
= new Thread[20];
            
int threadNum;


            Class1 Myclass 
= new Class1();
            ThreadStart myThreadStart 
= new ThreadStart(Myclass.AccessGlobalResource);

            
//Create 20 threads.
            for (threadNum = 0; threadNum < 20; threadNum++)
            
{
                threadArray[threadNum] 
= new Thread(myThreadStart);
            }


            
//Start the threads.
            for (threadNum = 0; threadNum < 20; threadNum++)
            
{
                threadArray[threadNum].Start();
            }


            
//Wait until all the thread spawn out finish.
            for (threadNum = 0; threadNum < 20; threadNum++)
                threadArray[threadNum].Join();

            Console.WriteLine(
"All operations have completed. Press enter to exit");
            Console.ReadLine();
        }


        
public void AccessGlobalResource()
        
{
            Random rnd 
= new Random();
            
long theNumber;

            
if (rnd.Next() % 2 != 0)
                theNumber 
= Number;
            
else
            
{
                theNumber 
= rnd.Next();
                Number 
= theNumber;
            }


        }

    }

}



说明了读写共享资源访问是不冲图的,如下图所示(这个方式解决了多个线程可同时读,只有一个线程可以定的操作的协调)ScreenCap.jpg
posted on 2006-04-29 09:00  共同学习,共同进步  阅读(306)  评论(0编辑  收藏  举报