【操作系统】进程同步(水果盘问题)使用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、结果

父亲放置苹果
女儿吃苹果

父亲放置苹果
女儿吃苹果

母亲放置桔子
儿子吃桔子

父亲放置苹果
女儿吃苹果

母亲放置桔子
儿子吃桔子

父亲放置苹果
女儿吃苹果

母亲放置桔子
儿子吃桔子

父亲放置苹果
女儿吃苹果

母亲放置桔子
儿子吃桔子

母亲放置桔子
儿子吃桔子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/578891.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序设计二

八、使用背景图片(background-image) 注意: url不能指定为本地地址可以将图片转化为base64方式使用。使用网络地址: background-image: url(https://img1.baidu.com); 考虑到版权问题,这里没有放具体路径。 使用base64格式指…

【Vue】可拖拽排序表格组件的实现与数据保存

1、描述 使用el-table-draggable组件来创建一个可拖拽的表格。 表格中的数据存储在tableData数组中,每个对象都有sortOrder、id、name和age属性。 当用户拖拽表格行并释放时,handleRowOnEnd方法会被调用, 更新tableData中每个对象的sortO…

SpringBoot 缓存

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 目录 一、缓存的作用二、SpringBoot启用缓存三…

腾讯云邮件推送如何设置?群发邮件的技巧?

腾讯云邮件推送功能有哪些?怎么有效使用邮件推送? 腾讯云邮件推送以其稳定、高效的特点,受到了众多企业的青睐。那么,腾讯云邮件推送如何设置呢?又有哪些群发邮件的技巧呢?下面AokSend就来详细探讨一下。 …

Express进阶升级

Express进阶升级🆙 本篇文章,学习记录于:尚硅谷🎢 文章简单学习总结:如有错误 大佬 👉点. 前置知识:需要掌握了解: JavaScript基础语法 、Node.JS环境API 、前端工程\模块化、Expr…

nvm基本使用

nvm基本使用 文章目录 nvm基本使用1.基本介绍2.下载地址3.常用指令 1.基本介绍 NVM是一个用于管理 Node.js 版本的工具。它允许您在同一台计算机上同时安装和管理多个 Node.js 版本,针对于不同的项目可能需要不同版本的 Node.js 运行环境。 NVM 主要功能&#xff…

【Redis | 第十篇】Redis与MySQL保证数据一致性(两种解决思路)

文章目录 10.Redis和MySQL如何保证数据一致性10.1双写一致性问题10.2数据高度一致性10.3数据同步允许延时10.3.1中间件通知10.3.2延迟双删 10.Redis和MySQL如何保证数据一致性 10.1双写一致性问题 Redis作为缓存,它是如何与MySQL的数据保持同步的呢?特…

PHP 错误 Unparenthesized `a ? b : c ? d : e` is not supported

最近在一个新的服务器上测试一些老代码的时候得到了类似上面的错误: [Thu Apr 25 07:37:34.139768 2024] [php:error] [pid 691410] [client 192.168.1.229:57183] PHP Fatal error: Unparenthesized a ? b : c ? d : e is not supported. Use either (a ? b : …

『FPGA通信接口』串行通信接口-SPI

文章目录 1.SPI简介2.控制时序3.Dual、Qual模式4.例程设计与代码解读5.SPI接口实战应用5.1时序要求5.2仿真时序图5.3代码设计 6.传送门 1.SPI简介 SPI是串行外设接口(Serial Peripheral Interface)的缩写,通常说SPI接口或SPI协议都是指SPI这…

将文件导入数据库

#include <stdio.h> #include <sqlite3.h> #include <string.h> int main(int argc, const char *argv[]) { //打开数据库 sqlite3 *db NULL; if(sqlite3_open("./dict.db",&db) ! SQLITE_OK){ printf("sqlite…

5G随身WiFi推荐测评:品速5G VS 格行5G随身WiFi,随身wifi哪个品牌网速好?性价比更高?

玩游戏卡顿遭吐槽&#xff0c;直播掉线成笑柄&#xff0c;4G网络已难满足需求。5G随身wifi虽受追捧&#xff0c;但价格较高令人犹豫。面对众多品牌&#xff0c;随身WiFi哪个品牌靠谱呢&#xff1f;性价比高呢&#xff1f;今天就来测评一下口碑最好的无线随身WiFi格行5G随身wifi…

新能源车载芯片分析

新能源汽车市场正迸发出巨大的活力&#xff0c;传统主机厂和新势力都纷纷推出各种车型&#xff0c;打起了价格战&#xff0c;各种新技术让人眼花缭乱。当前&#xff0c;战场硝烟弥漫&#xff0c;新能源汽车公司犹如春秋时期的各诸侯国。车载芯片作为新能源汽车的关键组成部分&a…

NDK 基础(一)—— C 语言知识汇总

1、数据类型 在 C 语言中&#xff0c;数据类型可以分为如下几类&#xff1a; 基本数据类型&#xff1a; 整数类型&#xff08;Integer Types&#xff09;&#xff1a;是算数类型&#xff0c;包括如下几种&#xff1a; int&#xff1a;用于表示整数数据&#xff0c;通常占用四个…

nvm 切换 Node 版本失败

创建vue3项目时&#xff0c;需要切换到更高版本的 node&#xff0c;于是使用 nvm (node 包版本管理工具)进行版本切换 切换版本时&#xff0c;显示成功&#xff0c;但再次查看当前 node 版本时&#xff0c;发现没切换过来。 解决方法&#xff1a; where node 查看node的安装…

车道分割YOLOV8-SEG

车道分割YOLOV8-SEG&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTHON,ANDROID开发 车道分割YOLOV8-SEG

深圳工厂车间降温通风设备

深圳工厂降温方案多种多样&#xff0c;可以根据工厂的具体情况和需求来选择合适的方案。以下是一些常见的降温方案&#xff1a; 通风换气&#xff1a;通过安装负压风机或冷风机等设备&#xff0c;加强通风换气&#xff0c;将室内热空气排出&#xff0c;吸入室外相对凉爽的空气…

零基础俄语培训哪家好,柯桥俄语培训

1、Мощный дух спасает расслабленное тело. 强大的精神可以拯救孱弱的肉体。 2、Единственное правило в жизни, по которому нужно жить — оставаться человеком в лю…

WSL及UBUNTU及xfce4安装

如何拥有Linux服务器&#xff1f; wsl 是适用于 Linux 的 Windows 子系统&#xff08;Windows Subsystem for Linux&#xff09;。是一个为在Windows 10和Windows Server 2019上能够原生运行Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层&#xff0c;可让开发…

Docker 的数据管理 端口映射 容器互联 镜像创建

一 Docker 的数据管理 1 管理 Docker 容器中数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09; 数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1.1 数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机…

数据污染对大型语言模型的潜在影响

大型语言模型&#xff08;LLMs&#xff09;中存在的数据污染是一个重要问题&#xff0c;可能会影响它们在各种任务中的表现。这指的是LLMs的训练数据中包含了来自下游任务的测试数据。解决数据污染问题至关重要&#xff0c;因为它可能导致结果偏倚&#xff0c;并影响LLMs在其他…