PV操作 图书馆问题 C#

本文通过使用信号量和P、V操作解决图书馆的读者登记与注销问题,展示了如何利用多线程和互斥锁实现资源的合理分配与进程同步。在一个拥有100个座位的阅览室中,读者进入时需要登记,离开时注销,通过代码实现确保了座位资源的正确管理和使用。

问题描述

有一阅览室,读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号、姓名。读者离开时要注销登记信息;
假如阅览室共有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();
           }
        }
    }
}



虽然给定引用中未直接提供PV操作实现图书馆借书问题的运行代码,但可以基于PV操作的原理来编写代码。PV操作主要用于实现进程间的同步和互斥,在图书馆借书问题中,书是共享资源,多个学生(进程)会竞争借书,需要使用互斥信号量来保证同一时间只有一个学生能借书或还书。 以下是使用Python和`threading`模块模拟PV操作实现图书馆借书问题的代码: ```python import threading # 初始化互斥信号量,初值为1 mutex = threading.Semaphore(1) # 图书馆的书的数量 books = 10 def borrow_book(student_id): global books # P操作,申请进入临界区 mutex.acquire() if books > 0: books -= 1 print(f"学生 {student_id} 成功借到书,剩余书的数量: {books}") else: print(f"学生 {student_id} 借书失败,没有可用的书。") # V操作,离开临界区 mutex.release() def return_book(student_id): global books # P操作,申请进入临界区 mutex.acquire() books += 1 print(f"学生 {student_id} 归还了书,剩余书的数量: {books}") # V操作,离开临界区 mutex.release() # 创建学生线程 students = [] for i in range(15): if i % 2 == 0: t = threading.Thread(target=borrow_book, args=(i,)) else: t = threading.Thread(target=return_book, args=(i,)) students.append(t) t.start() # 等待所有线程完成 for t in students: t.join() ``` 由于无法直接提供代码运行截图,你可以将上述代码复制到Python环境中运行,运行步骤如下: 1. 打开Python集成开发环境(如PyCharm、VS Code等)或者使用命令行Python解释器。 2. 将代码复制到编辑器中。 3. 运行代码,在控制台会输出学生借书和还书的信息。 4. 使用截图工具(如Windows的截图快捷键`Win + Shift + S`或第三方截图软件)截取控制台输出的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值