PV操作 图书馆问题 C#

问题描述

有一阅览室,读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号、姓名。读者离开时要注销登记信息;
假如阅览室共有100个座位,试用信号量和P、V操作来实现进程的同步算法。

问题分析

Semaphore(信号量)两个:mutex(互斥),seatcount。
Thread(线程)N个:几个读者就有几个线程。

代码实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace pv操作_图书馆问题_
{
    class Program
    {
        private static Semaphore mutex, seatcount;
        private static string[] table=new string[100];
        static void Main(string[] args)
        {
            mutex = new Semaphore(1, 1);
            seatcount = new Semaphore(100, 100);

            Random r = new Random();
            //假设有150读者
            for (int i = 1; i <= 150; i++)
            {
                Thread read = new Thread(reader);
                read.Start(r.Next(1, 151));
            }
        }

        public static void reader(object num)    //座位号从0号到99号
        {
            int seatnumber=-1;
           while(true)
           {
               seatcount.WaitOne();
               mutex.WaitOne();
               for (int i = 0; i < 100; i++)
               {
                   if (table[i]==null||table[i]=="")
                   {
                       table[i] = num.ToString() + "号读者";
                       seatnumber = i;
                       break;
                   }
               }
               Console.WriteLine(num.ToString() + "号读者已填写登记表");
               mutex.Release();
               Console.WriteLine(num.ToString() + "号读者正在"+seatnumber+"号座位阅读");
               Thread.Sleep(5000);
               mutex.WaitOne();
               for (int i = 0; i < 100; i++)
               {
                   if (table[i] == num.ToString()+"号读者")
                   {
                       table[i] = "";
                       seatnumber = -1;
                       break;
                   }
               }
               Console.WriteLine(num.ToString() + "号读者注销");
               mutex.Release();
               seatcount.Release();
           }
        }
    }
}



  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值