閱覽室問題(C#實現)

#實現語言: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();  // 釋放一個座位資源
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章