#實現語言:C#
#問題描述:
有一個閱覽室,共有100個座位,讀者進入時必須先在一張登記表上登記,該表爲每一座位列一表目,包括座號和讀者姓名等,讀者離開時要消掉登記的信息
#問題分析:
讀者的動作有兩個,一是填表進入閱覽室,這時要考慮閱覽室裏是否有座位;一是讀者閱讀完畢,離開閱覽室,這時的操作要考慮閱覽室裏是否有讀者.讀者在閱覽室讀書時,由於沒有引起資源的變動,不算動作變化.
算法的信號量有三個:empty——表示閱覽室是否有空座位(初值爲100,代表閱覽室的空座位數);reader——表示閱覽室裏的讀者數,初值爲0;用於互斥的mutex,初值爲1.
using System;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
private static Semaphore empty,reader, mutex;
private static int num = 0;
static void Main(string[] args)
{
empty = new Semaphore(100, 100);
reader = new Semaphore(0, 100);
mutex = new Semaphore(1, 1);
Thread GetIn = new Thread(getIn);
Thread GetOut = new Thread(getOut);
GetIn.Start();
GetOut.Start();
}
protected static void getIn()
{
while (true)
{
empty.WaitOne(); // 沒有座位則等待
mutex.WaitOne(); // 申請填表,進入臨界區
Console.WriteLine("填寫登記表");
Thread.Sleep(1000);
Console.WriteLine("進入閱覽室讀書 "+(++num));
Console.WriteLine("");
Thread.Sleep(1000);
mutex.Release(); // 填表完畢,離開臨界區
//reader.Release(); // 讀者數+1
}
}
protected static void getOut()
{
while (true)
{
//reader.WaitOne(); // 讀者數-1
mutex.WaitOne(); // 等待去除信息,進入臨界區
Console.WriteLine("擦除登記信息");
Thread.Sleep(1000);
Console.WriteLine("離開閱覽室 "+(--num));
Console.WriteLine("");
Thread.Sleep(1000);
mutex.Release(); // 離開臨界區
empty.Release(); // 釋放一個座位資源
}
}
}
}