C#实现读者写者问题

代码GitHub链接:https://github.com/tigmfg/RWProblem_csharp

实现读者写者问题
class ReaderWriterQue_Nomal
    {
        Semaphore book = new Semaphore(1, 1);
        int chapter = 0;

        public ReaderWriterQue_Nomal()
        {
        }

        public void write()
        {
            while (true)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "正在获取图书");
                book.WaitOne();
                chapter++;
                Console.WriteLine(Thread.CurrentThread.Name + "获得图书");
                Console.WriteLine(Thread.CurrentThread.Name + "正在编写第" + chapter.ToString() + "章");
                Thread.Sleep(500);
                Console.WriteLine(Thread.CurrentThread.Name + "放回图书");
                book.Release();
            }
        }

        public void read()
        {
            while (true)
            {
                if (chapter != 0)  //写者写了第一章才能读
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "正在获取图书");
                    book.WaitOne();
                    Console.WriteLine(Thread.CurrentThread.Name + "获得图书");
                    Console.WriteLine(Thread.CurrentThread.Name + "正在阅读...");
                    Thread.Sleep(500);
                    Console.WriteLine(Thread.CurrentThread.Name + "放回图书");
                    book.Release();
                }
            }
        }
    }

实例化类

class Program
    {
        static void Main(string[] args)
        {
            ReaderWriterQue_Nomal book = new ReaderWriterQue_Nomal();
            //ReaderWriterQue_Reader book = new ReaderWriterQue_Reader();
            //ReaderWriterQue_Writer book = new ReaderWriterQue_Writer();
            Thread writer = new Thread(new ThreadStart(book.write));
            writer.Name = "作者";
            Thread reader1 = new Thread(new ThreadStart(book.read));
            reader1.Name = "读者1";
            Thread reader2 = new Thread(new ThreadStart(book.read));
            reader2.Name = "读者2";
            Thread reader3 = new Thread(new ThreadStart(book.read));
            reader3.Name = "读者3";
            writer.Start();
            reader1.Start();
            reader2.Start();
            reader3.Start();
            writer.Join();
            reader1.Join();
            reader2.Join();
            reader3.Join();
        }
    }
读者优先算法
class ReaderWriterQue_Reader
    {
        Semaphore book = new Semaphore(1, 1);
        Semaphore readers = new Semaphore(1,1);
        int readerCount = 0;
        int chapter = 0;

        public ReaderWriterQue_Reader()
        {
        }

        public void write()
        {
            while (true)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "正在获取图书");
                book.WaitOne();
                chapter++;
                Console.WriteLine(Thread.CurrentThread.Name + "获得图书");
                Console.WriteLine(Thread.CurrentThread.Name + "正在编写第" + chapter.ToString() + "章");
                Thread.Sleep(500);
                Console.WriteLine(Thread.CurrentThread.Name + "放回图书");
                book.Release();
            }
        }

        public void read()
        {
            while (true)
            {
                if (chapter != 0) 
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "正在获取图书");
                    readers.WaitOne();
                    readerCount++;
                    if (readerCount == 1)
                        book.WaitOne();  //第一个读者占用写者的信号量
                    readers.Release();  //让其他正在等待的读者进入
                    Console.WriteLine(Thread.CurrentThread.Name + "获得图书");
                    Console.WriteLine(Thread.CurrentThread.Name + "正在阅读...");
                    Thread.Sleep(500);
                    Console.WriteLine(Thread.CurrentThread.Name + "放回图书");
                    readers.WaitOne();
                    readerCount--;
                    if (readerCount == 0)  
                        book.Release();  //最后一个读者释放写的资源
                    readers.Release();
                }
            }
        }
    }
写者优先算法
class ReaderWriterQue_Writer
    {
        Semaphore book = new Semaphore(1, 1);
        bool isWrite = false;
        int chapter = 0;

        public ReaderWriterQue_Writer()
        {
        }

        public void write()
        {
            while (true)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "正在获取图书");
                isWrite = true;  //当写者要编写时,标记编写状态
                book.WaitOne();  //写者占用读者资源
                chapter++;
                Console.WriteLine(Thread.CurrentThread.Name + "获得图书");
                Console.WriteLine(Thread.CurrentThread.Name + "正在编写第" + chapter.ToString() + "章");
                Thread.Sleep(500);
                Console.WriteLine(Thread.CurrentThread.Name + "放回图书");
                isWrite = false;
                book.Release();
            }
        }

        public void read()
        {
            while (true)
            {
                if (chapter != 0)
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "正在获取图书");
                    book.WaitOne();
                    if (isWrite)   //当写者要编写时,立马释放资源
                    {
                        book.Release();
                        while (isWrite) { }   //当编写结束,再次接管资源
                        book.WaitOne();
                    }
                    Console.WriteLine(Thread.CurrentThread.Name + "获得图书");
                    Console.WriteLine(Thread.CurrentThread.Name + "正在阅读...");
                    Thread.Sleep(500);
                    Console.WriteLine(Thread.CurrentThread.Name + "放回图书");
                    book.Release();
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值