多线程处理
- 问题描述
- 问题分析
- 代码实现
问题描述
有一阅览室,读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号、姓名。读者离开时要注销登记信息;
假如阅览室共有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();
}
}
}
}