[原创]C#编写的读者写者问题(公平竞争的读者写者)

原创 2004年09月29日 18:47:00

// 读者写者问题

using System;
using System.Threading;

public class Book{

        private int[] pages;
        private bool aWriterWait = false;
        private int readerCount = 0;

        private object mutex = new Object();    // 控制对 readerCount 的访问
        private object db = new Object();       // 控制对 pages 的访问
        private object obj  = new Object();     // 控制对 aWriterWait 的访问
        

        public Book(int numOfPages){
                pages = new int[numOfPages];
        }

        public int NumOfPages{
                get{
                        return pages.Length;    //常量,无须同步
                }
        }

        public int this[int index]{
                get{
                        lock(obj){
                                while( aWriterWait ){
                                        Monitor.Wait(obj);
                                }
                        }

                        lock(mutex){    
                                // readerCount的锁
                                // 检查是否为第一个读者
                                readerCount++;
                                if(readerCount == 1)    Monitor.Enter(db);
                        }
                        
                        int valueCopy = pages[index];   // 读取一个数据

                        Console.WriteLine( Thread.CurrentThread.Name + " 读了 第" + (index + 1) + "页,他读到的数据是" + valueCopy );

                        DisplayContent();

                        lock(mutex){
                                readerCount--;
                                if(readerCount == 0)    Monitor.Exit(db);
                        }

                        return valueCopy;
                }
                set{
                        lock (obj){
                                aWriterWait = true;
                        }

                        lock(db){       // 阻止其他的写者去写书
                                pages[index] = value;
                                Console.WriteLine( Thread.CurrentThread.Name + "把" + value + "写到第" + (index + 1) + "页");
                                DisplayContent();
                        }

                        lock(obj){
                                aWriterWait = false;
                                Monitor.PulseAll(obj);  // 通知等待的读者
                        }
                }
        }
        
        private void DisplayContent(){
                Console.WriteLine("{0,-35}","书的内容是:");
                for(int i = 0;i < pages.Length;i++){
                        Console.Write("{0,-9}",pages[i]);
                }
                Console.WriteLine("/r/n");
        }
}

public class Reader{
        private Book book;
        private Random rand;
        
        public Reader(Book b,Random random){
                book = b;
                rand = random;
        }
        
        public void Read(){
                for (int i=0; i < 5; i++){
                        int p = rand.Next(0,book.NumOfPages);
                        int a = book[p];
                        Thread.Sleep(rand.Next(0,100));
                }
        }
}


public class Writer{
        private Book book;
        private Random rand;
        
        public Writer(Book b,Random random){
                book = b;
                rand = random;
        }
        
        public void Write(){
                for(int i = 0;i < 5;i++){
                        int p = rand.Next(0,book.NumOfPages);
                        book[p] = rand.Next(50,100);
                        Thread.Sleep(rand.Next(0,100));
                }
        }
}

public class Test{
        public static void Main(string[] args){
                Book book = new Book(5);
                Random random = new Random();
                
                string[] readerNames = {"猪八戒","唐僧","沙和尚"};
                string[] writerNames = {"观音菩萨","孙悟空","玉皇大帝"};

                Thread[] readerThreads = new Thread[3];
                Thread[] writerThreads = new Thread[3];

                for(int i = 0;i < 3;i++){
                        Reader reader = new Reader(book,random);
                        readerThreads[i] = new Thread(new ThreadStart(reader.Read));
                        readerThreads[i].Name = readerNames[i];
                        
                        Writer writer = new Writer(book,random);
                        writerThreads[i] = new Thread(new ThreadStart(writer.Write));
                        writerThreads[i].Name = writerNames[i];

                }
                
                for (int i=0; i<3; i++){
                        readerThreads[i].Start();
                        writerThreads[i].Start();
                }      
        }
}

读者-写者问题 写者优先与公平竞争

读者-写者问题 写者优先与公平竞争   多进程对共享资源互斥访问及进程同步的经典问题 设有一文件F,多个并发读进程和写进程都要访问,要求: (1)读写互斥 (2)写...
  • skytlt
  • skytlt
  • 2013年12月19日 11:05
  • 682

读者写者问题(读者优先、写者优先、公平竞争)

读者优先: 1.写者、读者互斥访问文件资源。 2.多个读者可以同时访问文件资源。 3.只允许一个写者访问文件资源。 具体实现: 1.设置信号量fileSrc实现读写者对临界资源的访问。 2.设置计数...
  • c1194758555
  • c1194758555
  • 2016年10月13日 13:00
  • 2828

“读者-写者问题”的写者优先算法实现

读者一写者问题是一个用信号量实现的经典进程同步问题。在系统中,一个数据集( 如文件或记录) 被几个并发进程共享,这些线程分两类,一部分只要求进行复操作,称之为“读者”;另一类要求写或修改操作,我们称之...
  • zoudaokou2006
  • zoudaokou2006
  • 2009年03月07日 18:45
  • 24680

经典同步问题(三)---读者写者问题

读者写者问题的信号量和条件变量算法
  • sunny_ss12
  • sunny_ss12
  • 2015年08月12日 03:06
  • 2732

读者写者问题-写者优先参考答案

【写者优先】在读者、写者问题中,如果总有读者进程进行读操作,会造成写者进程永远都不能进行写操作(读者优先),即所谓的写者饿死现象。给出读者、写者问题的另一个解决方案:即保证当有一个写者进程想写时,不允...
  • CQZHOUZR
  • CQZHOUZR
  • 2016年06月28日 10:07
  • 3158

java实现读者-写者问题

问题背景:一个数据文件或记录,可以被多个进程或者线程共享,其中不同的读进程可以并发的访问该临界资源,读和写进程或者线程,不能并发的对该临界资源进行错误,否则造成脏读和脏写。而我们今天的读者和写者模式 ...
  • gao23191879
  • gao23191879
  • 2017年07月15日 17:53
  • 307

读者写者问题浅析(代码实现)

读者作家(RW)或共享独占锁(也称为多个读取器/单写入器锁定或多读卡器锁)的一个同步原语,解决了一个读者-writers问题。一个RW锁允许并发的只读操作的访问,而写操作需要独占访问。这意味着多个线程...
  • github_35124642
  • github_35124642
  • 2016年07月20日 20:41
  • 2083

读者-写者问题思想

读者-写者问题是一个经典的并发程序设计问题,是经常出现的一种同步问题。计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者);另一些进程则要求修改数据(称为写者)...
  • metheir
  • metheir
  • 2016年10月19日 22:11
  • 747

读写者问题-java实现

读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数...
  • yilip
  • yilip
  • 2014年12月17日 20:39
  • 4232

C#模拟读者写者问题

原本是操作系统的一个上机作业,上课没注意听所以一直都不知道,明天都要交了只好用C#简单写了个,好在.NET强大的FCL提供了读者写者锁类,因此实现起来方便许多,读者写者锁在读者数目多于写者时会显示出比...
  • maliang00111
  • maliang00111
  • 2006年11月09日 18:09
  • 2146
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[原创]C#编写的读者写者问题(公平竞争的读者写者)
举报原因:
原因补充:

(最多只允许输入30个字)