⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pppp.cs

📁 一个基于VC#.NET实现的进程管理之读者写者模拟算法。
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace 杨梅凤
{
    public class Book
    {

        public static string progress = "";

        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]; // 读取一个数据

                progress += "["+Thread.CurrentThread.Name+"]" + "读了 第" + (index + 1) + "页,他读到的数据是:" + valueCopy.ToString()+" ";

                DisplayContent();

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

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

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

                lock (obj)
                {
                    aWriterWait = false;
                    Monitor.PulseAll(obj); // 通知等待的读者
                }
            }
        }

        private void DisplayContent()
        {
            progress += string.Format("{0,-35}", "书的内容是:");
            for (int i = 0; i < pages.Length; i++)
            {
                progress += string.Format("{0,-9}", pages[i]);
            }
            progress += "\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));
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -