进程同步实验(OS)

计算机操作系统实验,进程同步问题,使用python实现

效果如下

代码如下

import time
from threading import Thread
from prettytable import PrettyTable
c = int(input("请输入缓冲区个数:"))
cache = []
lock = []
for x in range(c):  # 初始化缓冲区和锁
    lock.append(0)
    cache.append(0)

p = int(input("请输入生产者个数:"))
cu = int(input("请输入消费者个数:"))    # 从键盘读入生产者和消费者数量

# print(cache, p, cu, lock)
infotable = PrettyTable(["CACHE", "PRODUCER", "CONSUMER"])   # 用表格更美观显示当前情况
infotable.add_row([c, p, cu])
print(infotable)


def producer(name):    # 生产者
    while True:
        for i in range(c):
            if cache[i] == 0:
                if lock[i] == 0:
                    lock[i] = 1
                    print(f"生产者{name}号生产了一件产品放在{i}号缓冲区")
                    cache[i] = 1
                    lock[i] = 0
                    time.sleep(1)
                    break
            if i == c-1 and i != 0:     # 没找到可用缓冲区
                print("缓冲区已满,等待2s")
                time.sleep(2)
        if STOP_THREADS:
            break


def consumer(name):     # 消费者

    while True:

        for i in range(c):
            if cache[i] == 1:
                if lock[i] == 0:
                    lock[i] = 1
                    print(f"消费者{name}号从缓冲区{i}号消费了一件产品")
                    cache[i] = 0
                    lock[i] = 0
                    time.sleep(1)
                    break
        if i == c-1 and i != 0:
            print("缓冲区已空,等待2s")
            time.sleep(2)
        if STOP_THREADS:
            break


STOP_THREADS = False    # 信号量控制结束
pthreads = []
cthreads = []

for y in range(p):
    pthreads.append(Thread(target=producer, args=f"{y}"))   # 批量创建线程

y = 0
for y in range(cu):
    cthreads.append(Thread(target=consumer, args=f"{y}"))   # 创建线程

# print(pthreads,cthreads)
print("启动")
y = 0
for y in range(p):
    pthreads[y].start()     # 批量启动线程
    time.sleep(0.1)

y = 0
for y in range(cu):
    cthreads[y].start()     # 启动线程
    time.sleep(0.1)

time.sleep(3)
STOP_THREADS = True
time.sleep(1)       # 等待1s确认都执行完毕后输出结束
print("结束")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值