代码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();
}
}
}
}