📄 pppp.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 + -