【操作系统】进程同步(水果盘问题)使用Python多线程threading实现

一、进程同步(水果盘问题)

1、吃水果问题:桌子有一只盘子,只允许放一个水果,父亲专向盘子放苹果,母亲专向盘子放桔子 儿子专等吃盘子的桔子,女儿专等吃盘子的苹果。只要盘子为空,父亲或母亲就可以向盘子放水果, 仅当盘子有自己需要的水果时,儿子和女儿可从盘子取出。请给出四个人之间的同步关系,并用 pv操作实现四个人的正确活动的问题。  

2、题目分析:父亲和女儿是相互制约的,父亲进程执行完即往盘中放入苹果后,女儿进程才能执行即吃苹果,是同步关系; 母亲和儿子是相互制约的,母亲进程执行完即往盘中放入桔子,儿子进程才能执行即吃桔子,也是同步关系 而父亲和母亲这两个进程不能同时进行,是互斥关系。

3、代码实现:

①通过`threading.Semaphore`创建了三个信号量:
empty_plate:表示空盘子的信号量,初始值为1,表示盘子是空的。
apple:表示苹果的信号量,初始值为0,表示没有苹果可供吃。
orange:表示桔子的信号量,初始值为0,表示没有桔子可供吃。

②定义四个函数:
father():父亲放置苹果的函数。
mother():母亲放置桔子的函数。
daughter():女儿吃苹果的函数。
son():儿子吃桔子的函数。

在父亲和母亲的函数中,通过`empty_plate.acquire()`来获取空盘子,然后输出相应的动作(放置苹果或桔子),最后通过`apple.release()`或`orange.release()`释放对应的信号量,表示放置了苹果或桔子。

在女儿和儿子的函数中,分别通过`apple.acquire()`和`orange.acquire()`来获取苹果或桔子的信号量,表示可以吃水果了,然后输出相应的动作(吃苹果或桔子),最后通过`empty_plate.release()`释放空盘子的信号量,表示吃完了。

③创建了四个线程,分别对应父亲、母亲、女儿和儿子的函数,并启动这四个线程。

④通过`join()`方法等待四个线程执行结束。

import threading
import time

empty_plate = threading.Semaphore(1)
apple = threading.Semaphore(0)
orange = threading.Semaphore(0)

def father():
    for i in range(5):
        empty_plate.acquire()
        print("\n父亲放置苹果")
        apple.release()

def mother():
    for i in range(5):
        empty_plate.acquire()
        print("\n母亲放置桔子")
        orange.release()

def daughter():
    while True:
        apple.acquire()
        print("女儿吃苹果")
        empty_plate.release()

def son():
    while True:
        orange.acquire()
        print("儿子吃桔子")
        empty_plate.release()

# 创建线程
father_thread = threading.Thread(target=father)
mother_thread = threading.Thread(target=mother)
daughter_thread = threading.Thread(target=daughter)
son_thread = threading.Thread(target=son)

# 启动线程
father_thread.start()
mother_thread.start()
daughter_thread.start()
son_thread.start()

# 等待线程结束
father_thread.join()
mother_thread.join()
daughter_thread.join()
son_thread.join()

4、结果

父亲放置苹果
女儿吃苹果

父亲放置苹果
女儿吃苹果

母亲放置桔子
儿子吃桔子

父亲放置苹果
女儿吃苹果

母亲放置桔子
儿子吃桔子

父亲放置苹果
女儿吃苹果

母亲放置桔子
儿子吃桔子

父亲放置苹果
女儿吃苹果

母亲放置桔子
儿子吃桔子

母亲放置桔子
儿子吃桔子
  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值