当前位置: 首页 > news >正文

【操作系统】吸烟者问题

问题描述

        吸烟者问题是一个经典的同步问题,涉及三个抽烟者进程和一个供应者进程。每个抽烟者需要三种材料(烟草、纸和胶水)来卷烟,但每个抽烟者只有一种材料。供应者每次提供两种材料,拥有剩下那种材料的抽烟者可以卷烟并抽掉它。

问题分析
  1. 同步关系:供应者与三个抽烟者之间存在同步关系,供应者提供材料后,抽烟者才能开始卷烟。

  2. 互斥关系:三个抽烟者之间是互斥的,即同一时间只能有一个抽烟者卷烟。

  3. 信号量设置:需要设置信号量来控制材料的供应和抽烟者的动作。

解决方案

使用信号量来实现同步和互斥:

  • 信号量定义

    • offer1offer2offer3:分别表示供应者提供的不同组合材料(如烟草和纸、烟草和胶水、纸和胶水)。

    • finish:用于通知供应者当前抽烟者已完成抽烟。

伪代码

  • 供应者

while(1){random = 任意一个整数随机数;random = random % 3;if (random == 0)V(offer1);  // 提供烟草和纸else if (random == 1)V(offer2);  // 提供烟草和胶水elseV(offer3);  // 提供纸和胶水P(finish);  // 等待抽烟者完成
}
  • 抽烟者

while(1){P(offerX);  // 等待供应者提供材料// 拿走材料,卷烟,抽掉V(finish);  // 通知供应者已完成
}
改进
  • 由于缓冲区大小为1,四个同步信号量中至多只有一个为1,因此finish信号量用于互斥是不必要的

实现详细代码: 

1. 供应者代码(supplier.c

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>#define NUM_SMOKERS 3// 信号量定义
sem_t offer1;  // 提供烟草和纸
sem_t offer2;  // 提供烟草和胶水
sem_t offer3;  // 提供纸和胶水
sem_t finish;  // 通知供应者当前抽烟者已完成void* supplier(void* arg) {while (1) {// 随机选择一组材料int random = rand() % NUM_SMOKERS;if (random == 0) {printf("Supplier: Offering tobacco and paper\n");sem_post(&offer1);  // 提供烟草和纸} else if (random == 1) {printf("Supplier: Offering tobacco and matches\n");sem_post(&offer2);  // 提供烟草和胶水} else {printf("Supplier: Offering paper and matches\n");sem_post(&offer3);  // 提供纸和胶水}// 等待抽烟者完成sem_wait(&finish);}
}int main() {pthread_t supplier_thread;// 初始化信号量sem_init(&offer1, 0, 0);sem_init(&offer2, 0, 0);sem_init(&offer3, 0, 0);sem_init(&finish, 0, 0);// 创建供应者线程pthread_create(&supplier_thread, NULL, supplier, NULL);// 主线程可以继续运行其他任务或等待pthread_join(supplier_thread, NULL);// 清理信号量sem_destroy(&offer1);sem_destroy(&offer2);sem_destroy(&offer3);sem_destroy(&finish);return 0;
}
2. 抽烟者代码(smoker.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>#define NUM_SMOKERS 3// 信号量定义
extern sem_t offer1;  // 提供烟草和纸
extern sem_t offer2;  // 提供烟草和胶水
extern sem_t offer3;  // 提供纸和胶水
extern sem_t finish;  // 通知供应者当前抽烟者已完成void* smoker1(void* arg) {while (1) {sem_wait(&offer1);  // 等待供应者提供烟草和纸printf("Smoker 1: Making a cigarette with tobacco and paper\n");printf("Smoker 1: Smoking...\n");sleep(1);  // 模拟抽烟时间sem_post(&finish);  // 通知供应者已完成}
}void* smoker2(void* arg) {while (1) {sem_wait(&offer2);  // 等待供应者提供烟草和胶水printf("Smoker 2: Making a cigarette with tobacco and matches\n");printf("Smoker 2: Smoking...\n");sleep(1);  // 模拟抽烟时间sem_post(&finish);  // 通知供应者已完成}
}void* smoker3(void* arg) {while (1) {sem_wait(&offer3);  // 等待供应者提供纸和胶水printf("Smoker 3: Making a cigarette with paper and matches\n");printf("Smoker 3: Smoking...\n");sleep(1);  // 模拟抽烟时间sem_post(&finish);  // 通知供应者已完成}
}int main() {pthread_t smoker1_thread, smoker2_thread, smoker3_thread;// 初始化信号量(假设已经在supplier.c中初始化)extern sem_t offer1, offer2, offer3, finish;// 创建抽烟者线程pthread_create(&smoker1_thread, NULL, smoker1, NULL);pthread_create(&smoker2_thread, NULL, smoker2, NULL);pthread_create(&smoker3_thread, NULL, smoker3, NULL);// 主线程可以继续运行其他任务或等待pthread_join(smoker1_thread, NULL);pthread_join(smoker2_thread, NULL);pthread_join(smoker3_thread, NULL);return 0;
}

代码说明

  1. 信号量初始化

    • supplier.c中初始化信号量offer1offer2offer3finish

    • smoker.c中声明这些信号量为外部变量。

  2. 供应者逻辑

    • 供应者随机选择一组材料并提供。

    • 使用sem_post通知一个抽烟者可以开始卷烟。

    • 使用sem_wait等待抽烟者完成。

  3. 抽烟者逻辑

    • 每个抽烟者等待特定的材料组合。

    • 使用sem_wait等待供应者提供材料。

    • 模拟卷烟和抽烟过程。

    • 使用sem_post通知供应者已完成。

编译与运行

  1. 将上述代码保存为supplier.csmoker.c

  2. 使用以下命令编译代码:

    gcc -pthread -o supplier supplier.c
    gcc -pthread -o smoker smoker.c
  3. 运行程序:

    ./supplier &
    ./smoker

 

输出示例

运行程序后,你将看到类似以下的输出:

Supplier: Offering tobacco and paper
Smoker 1: Making a cigarette with tobacco and paper
Smoker 1: Smoking...
Supplier: Offering tobacco and matches
Smoker 2: Making a cigarette with tobacco and matches
Smoker 2: Smoking...
Supplier: Offering paper and matches
Smoker 3: Making a cigarette with paper and matches
Smoker 3: Smoking...

总结

        这个实现通过信号量控制供应者和抽烟者之间的同步,确保每次只有一个抽烟者能够获取材料并开始卷烟。

相关文章:

【操作系统】吸烟者问题

问题描述 吸烟者问题是一个经典的同步问题&#xff0c;涉及三个抽烟者进程和一个供应者进程。每个抽烟者需要三种材料&#xff08;烟草、纸和胶水&#xff09;来卷烟&#xff0c;但每个抽烟者只有一种材料。供应者每次提供两种材料&#xff0c;拥有剩下那种材料的抽烟者可以卷烟…...

mysql-内置函数,复合查询和内外连接

一 日期函数 函数名称描述示例current_date()返回当前日期&#xff08;格式&#xff1a;yyyy-mm-dd&#xff09;select current_date(); → 2017-11-19current_time()返回当前时间&#xff08;格式&#xff1a;hh:mm:ss&#xff09;select current_time(); → 13:51:21current…...

软件架构之旅(6):浅析ATAM 在软件技术架构评估中的应用

文章目录 一、引言1.1 研究背景1.2 研究目的与意义 二、ATAM 的理论基础2.1 ATAM 的定义与核心思想2.2 ATAM 涉及的质量属性2.3 ATAM 与其他架构评估方法的关系 三、ATAM 的评估流程3.1 准备阶段3.2 场景和需求收集阶段3.3 架构描述阶段3.4 评估阶段3.5 结果报告阶段 四、ATAM …...

【SQL触发器、事务、锁的概念和应用】

【SQL触发器、事务、锁的概念和应用】 1.触发器 (一)触发器概述 1.触发器的定义 触发器(Trigger)是一种特殊的存储过程,它与表紧密相连,可以是表定义的一部分。当预定义的事件(如用户修改指定表或者视图中的数据)发生时,触发器会自动执行。 触发器基于一个表创建,…...

5.4学习记录

今天的目标是复习刷过往的提高课的DP题目&#xff1a;重点是数位DP&#xff0c;状态压缩DP&#xff0c;然后去做一些新的DP题目 然后明天的任务就是把DP的题目汇总&#xff0c;复习一些疑难的问题 方格取数&#xff1a; 题目背景 NOIP 2000 提高组 T4 题目描述 设有 NN 的方…...

Hadoop 1.x设计理念解析

一、背景 有人可能会好奇&#xff0c;为什么要学一个二十年前的东西呢&#xff1f; Hadoop 1.x虽然是二十年前的&#xff0c;但hadoop生态系统中的一些组件如今还在广泛使用&#xff0c;如hdfs和yarn&#xff0c;当今流行spark和flink都依赖这些组件 通过学习它们的历史设计…...

缓存与数据库的高效读写流程解析

目录 前言1 读取数据的流程1.1 检查缓存是否命中1.2 从数据库读取数据1.3 更新缓存1.4 返回数据 2 写入数据的流程2.1 更新数据库2.2 更新或删除缓存2.3 缓存失效 3 缓存与数据库的一致性问题3.1 写穿&#xff08;Write-through&#xff09;策略3.2 写回&#xff08;Write-back…...

Linux中的粘滞位和开发工具和文本编辑器vim

1.粘滞位的使用的背景&#xff1a; 当几个普通用户需要文件共享操作时&#xff0c;他们就需要在同一个目录下进行操作&#xff0c;那么就诞生一个问题&#xff0c;由谁来创建这个公共的目录文件&#xff1f;假设是由其中的一个普通用户来创建一个默认的目录文件&#xff0c;这就…...

冯诺依曼结构与哈佛架构深度解析

一、冯诺依曼结构&#xff08;Von Neumann Architecture&#xff09; 1.1 核心定义 由约翰冯诺依曼提出&#xff0c;程序指令与数据共享同一存储空间和总线&#xff0c;通过分时复用实现存取。 存储器总带宽 指令带宽 数据带宽 即&#xff1a;B_mem f_clk W_data f_…...

如何提升个人情商?

引言 提升个人情商&#xff08;EQ&#xff09;是一个持续的自我修炼过程&#xff0c;涉及自我认知、情绪管理、人际沟通等多个方面。以下是一些具体且可实践的方法&#xff0c;帮助你逐步提升情商&#xff1a; 一、提升自我觉察能力 1. 记录情绪日记 每天回顾自己的情绪…...

JSON Web Token 默认密钥 身份验证安全性分析 dubbo-admin JWT硬编码身份验证绕过

引言 在web开发中&#xff0c;对于用户认证的问题&#xff0c;有很多的解决方案。其中传统的认证方式&#xff1a;基于session的用户身份验证便是可采用的一种。 基于session的用户身份验证验证过程&#xff1a; 用户在用进行验证之后&#xff0c;服务器保存用户信息返回sess…...

K230的ISP(图像信号处理器)通常支持多通道输出,常见配置为3个独立通道

也就是一个摄像头可以拍摄三种配置的图片&#xff0c;这样就可以调用三种&#xff1a; img_try sensor.snapshot(chnCAM_CHN_ID_0) img_try2 sensor.snapshot(chnCAM_CHN_ID_1) img_try3 sensor.snapshot(chnCAM_CHN_ID_2) 这样可以一图多用 eg&#xff1a; # 初始化并配…...

工程师 - 小米汽车尾部主动扩散器

关于小米SU7 Ultra的主动尾部扩散器&#xff0c;其设计初衷是为了平衡日常驾驶的节能需求与运动驾驶的操控性能。这一装置位于车辆尾部下方&#xff0c;具备自动调节功能&#xff0c;能够根据车速在0和32之间切换&#xff0c;同时也支持手动调整。 32度打开状态&#xff1a; 0度…...

Linux watch 命令使用详解

简介 watch 命令会以固定间隔&#xff08;默认每 2 秒&#xff09;重复运行给定命令&#xff0c;并在终端上显示其输出。它非常适合监控不断变化的输出&#xff0c;例如磁盘使用情况、内存使用情况、文件更改、服务状态等。 基础语法 watch [options] command常用选项 -n, -…...

RabbitMQ-基础

RabbitMQ-基础 文章目录 RabbitMQ-基础1.同步调用2.异步调用3.技术选型4.安装RabbitMQ(官方网址)https://www.rabbitmq.com/5.快速入门5.1收发消息5.1.1交换机5.1.2队列5.1.3绑定关系5.1.4发送消息 5.2数据隔离5.2.1用户管理5.2.2virtual host 6.Java客户端操作RabbitMQ6.1快速…...

第九周作业

安全专题笔记 1、文件上传 (1) 服务端白名单绕过 %00截断绕过要求虚拟机中搭建实验环境&#xff0c;分别实现GET、POST方法的绕过 前提条件&#xff1a; 1 php的版本需要在5.4以下 2 magic_quotes_gpc需要设置为off 启动phpstudy&#xff0c;前往php-ini将magic_quotes_gpc…...

AtCoder Beginner Contest 404 C-G(无F)题解

C. Cycle Graph? 题意 给你一个 N N N 个顶点 M M M 条边的简单&#xff08;无重边、自环&#xff09;无向图&#xff0c;第 i i i 条边连接节点 A i A_i Ai​ 和 B i B_i Bi​&#xff0c;判断这个图是不是一个环。 思路 首先一个图是环&#xff0c;要满足点数等于边…...

Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)

一、模型评估 1. 准确率&#xff08;Accuracy&#xff09;&#xff1a;这是最基本的评估指标之一&#xff0c;表示模型在测试集上正确 分类样本的比例。对于分类任务而言&#xff0c;准确率是衡量模型性能的直观标准。 2. 损失函数值&#xff08;Loss&#xff09;&#xff1…...

开上“Python跑的车”——自动驾驶数据可视化的落地之道

开上“Python跑的车”——自动驾驶数据可视化的落地之道 一、自动驾驶离不开“看得见”的智能 在智能汽车时代,自动驾驶已然不是“炫技”标签,而是一场技术实力的全面拉锯战。而在这场战役中,有一个极其关键但常被忽略的领域,叫做: 数据可视化(Data Visualization)。 为…...

Linux内核gcov修改为模块

Linux内核gcov修改为模块 Gcov 是 GNU 项目开发的代码覆盖率分析工具&#xff0c;与 GCC 编译器深度集成&#xff0c;用于统计程序运行时代码的执行情况&#xff0c;帮助开发者评估测试用例的完整性和代码质量。 Gcov工作原理 ​1. 编译插桩 编译时需添加 -fprofile-arcs -…...

【安装配置教程】linux部署AList记录

之前朋友安利给自己AList&#xff0c;这个工具可以很方便的管理个人的网盘内容&#xff0c;可以随时上传下载拉取&#xff0c;于是心血来潮自己部署并记录一下。 一、拉取下载脚本 在AList官网&#xff0c;找到安装下面的一键脚本 curl -fsSL "https://alist.nn.ci/v3.sh…...

题解:AT_abc245_e [ABC245E] Wrapping Chocolate

我绝对不会告诉你我打比赛时没做出来这道题。 题目简化&#xff1a;给定每个巧克力和盒子的长宽&#xff0c;已知每个盒子只能放一块巧克力&#xff0c;并且必须保证巧克力能放下&#xff0c;求是否所有巧克力都能放入。 思路&#xff1a;贪心、二分、排序、STL。 首先看到这…...

Linux 入门:操作系统进程详解(上)

目录 一.冯诺依曼体系结构 一&#xff09;. 软件运行前为什么要先加载&#xff1f;程序运行之前在哪里&#xff1f; 二&#xff09;.理解数据流动 二.操作系统OS(Operator System) 一&#xff09;.概念 二&#xff09;.设计OS的目的 三&#xff09;.如何理解操作系统…...

5.7/Q1,GBD数据库最新文章解读

文章题目&#xff1a;Global, regional, and national burden and trends of rheumatoid arthritis among the elderly population: an analysis based on the 2021 Global Burden of Disease study DOI&#xff1a;10.3389/fimmu.2025.1547763 中文标题&#xff1a;全球、区域…...

[pdf,epub]292页《分析模式》漫谈合集01-59提供下载

《分析模式》漫谈合集01-59的pdf、epub文件提供下载&#xff0c;地址&#xff1a; umlchina.com/url/ap.html&#xff0c;或查看本账号的CSDN资源。 已排版成适合手机阅读&#xff0c;pdf的排版更好一些。...

Spring MVC的工作流程, DispatcherServlet 的工作流程

Spring MVC 是一种基于Java的模型-视图-控制器&#xff08;MVC&#xff09;Web框架&#xff0c;它通过清晰的角色划分简化了Web应用开发。下面是Spring MVC的工作流程以及DispatcherServlet的具体工作流程。 Spring MVC 工作流程 请求到达&#xff1a;客户端发起一个HTTP请求…...

【Godot】使用 Shader 实现可配置圆角效果

文章目录 效果预览实现原理完整Shader代码关键参数详解1. 半径参数(radius)2. 角开关参数(hide_*)数学原理圆形区域判定公式坐标映射性能优化使用示例编辑器操作代码控制进阶技巧1. 添加抗锯齿2. 外发光效果3. 动画效果常见问题解决方案问题1:圆角边缘锯齿问题2:圆形变形…...

【翻译、转载】MCP 提示 (Prompts)

原文地址&#xff1a;https://modelcontextprotocol.io/docs/concepts/prompts#python 提示 (Prompts) 创建可重用的提示模板和工作流 提示 (Prompts) 使服务器能够定义可重用的提示模板和工作流&#xff0c;客户端可以轻松地将其呈现给用户和 LLM。它们提供了一种强大的方式来…...

论快乐的学习和学习的快乐

目录 一、背景二、过程1.快乐的学习&#xff1a;理念与实践快乐学习的理念溯源快乐学习在教育实践中的体现 2.学习的快乐&#xff1a;内涵与价值学习的快乐的多维内涵学习的快乐对个人成长的价值 3.快乐的学习与学习的快乐的相互关系快乐的学习是学习快乐的重要前提学习的快乐是…...

Git 命令

参考文献&#xff1a; Git 教程 | 菜鸟教程Git 使用教程&#xff1a;最详细、最正宗手把手教学&#xff08;万字长文&#xff09;git忽略某个目录或文件不上传 文章目录 工作原理基本命令配置使用 其他命令日志分支回退标签 忽略指定文件远程仓库 工作原理 Git 是由 Linus To…...

365打卡第R6周: LSTM实现糖尿病探索与预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 &#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.10 编译器&#xff1a;Jupyter Lab 深度学习环境&#xff1a;torch2.5.1 torchvision0…...

新能源实验室电磁兼容设计优化方案论述

摘要&#xff1a;本文旨在进行新能源核心部件/系统测试实验室电磁兼容情况设计及优化方案进行论述&#xff0c;通过系统化梳理实验室的主流设备仪器&#xff0c;试验搭建典型方案。识别不同设备的电磁兼容现状&#xff0c;实验室基于设备布局常见设计方案不足点&#xff0c;故障…...

计算机图形学中的深度学习

文章目录 零、前言0.课程考核1.课程大纲2.前置知识3.教材4.课程大纲5.相关课程 Relevant Courses 一、计算机图形学1.本章学习目标2.图形学的应用3.SIG Graph papers 二、基本图形生成算法1.本章学习目标2.图形API3.OpenGL(1)什么是OpenGL(2)OpenGL 的基本组件&#xff1a;顶点…...

RockyLinux9.3-24小时制

在 RockyLinux 9.3 中&#xff0c;默认时间格式为 12 小时制&#xff0c;调整为 24 小时制 案例一&#xff1a;在 RockyLinux 9.3 中&#xff0c;默认时间格式为 12 小时制&#xff0c;调整为 24 小时制案例二&#xff1a;时间显示英文调整为中文endl 案例一&#xff1a;在 Roc…...

25.2linux中外置RTC芯片的PCF8563实验(测试)_csdn

1、硬件原理图分析 知道了这些引脚我们还是按照老习惯&#xff01; 配置镜像和设备树文件&#xff01; 2、修改设备树 2.1、添加或者查找 PCF8563 所使用的 IO 的 pinmux 配置 打开stm32mp15-pincrtl.dtsi 文件&#xff0c;查找节点I2C4: 也就是中断引脚并不需要配置pinctrl…...

高性能 WEB 服务器 Nginx:多虚拟主机实现!

Nginx 配置多虚拟主机实现 多虚拟主机是指在一台 Nginx 服务器上配置多个网站 在 Nginx 中&#xff0c;多虚拟主机有三种实现方式&#xff1a; 基于IP地址实现多虚拟主机 基于端口号实现多虚拟主机 基于域名实现多虚拟主机 1 基于域名实现多虚拟主机 在 Nginx 中配置多个…...

C++ 的类型排序

0.前言 在 C 中&#xff0c;我编写了一个 tuple-like 模板&#xff0c;这个模板能容纳任意多且可重复的类型&#xff1a; template<typename... Ts> struct TypeList {};// usage: using List1 TypeList<int, double, char, double>; using List2 TypeList<…...

[计算机网络]拓扑结构

拓扑结构一般会在计网教材或课程的第一章计网的分类那里接触到&#xff0c;但实际上计网的拓扑结构并不只是第一章提到的总线型、星型、树型、网状、混合型那几种类型那么简单&#xff0c;学完了后面的数链层以后对拓扑结构会有新的体会&#xff0c;所以特别单独总结成一篇博客…...

C#方法返回值全解析:从基础语法到实战技巧

摘要&#xff1a;方法返回值是C#编程的核心概念之一。本文将带你彻底掌握返回值声明、void方法特性&#xff0c;以及如何通过返回值实现优雅的流程控制&#xff08;文末附完整示例代码&#xff09;。 返回值的基础法则 类型声明原则 有返回值&#xff1a;必须在方法名前声明…...

修复笔记:SkyReels-V2 项目中的 torch.cuda.amp.autocast 警告和错误

#工作记录 一、问题描述 在运行项目时&#xff0c;出现以下警告和错误&#xff1a; FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) instead.with torch.cuda.amp.autocast(dtypepipe.transformer.dtype), …...

【TF-BERT】基于张量的融合BERT多模态情感分析

不足&#xff1a;1. 传统跨模态transformer只能处理2种模态&#xff0c;所以现有方法需要分阶段融合3模态&#xff0c;引发信息丢失。2. 直接拼接多模态特征到BERT中&#xff0c;缺乏动态互补机制&#xff0c;无法有效整合非文本模态信息 改进方法&#xff1a;1. 基于张量的跨模…...

SONiC-OTN代码详解(具体内容待续)

SONiC-OTN代码详解 &#xff08;具体内容待续&#xff09; 基于AI的源代码解析工具的产生使得代码阅读和解析变得越来越高效和简洁&#xff0c;计划通过这样的工具对SONiC在OTN领域的应用做一个全自动的解析&#xff0c;大部分内容会基于AI工具的自动解析结果。这样做的目的是…...

牛客周赛90 C题- Tk的构造数组 题解

原题链接 https://ac.nowcoder.com/acm/contest/107500/C 题目描述 解题思路 数组a是不可以动的&#xff0c;所以我们可以把a[i]*b[i]*i分成两组&#xff0c;分别为a[i]*i以及b[i] 然后策略就很明显了&#xff0c;让更大的b[i]匹配更大的a[i]*i 详细实现见代码。 代码&am…...

[ML]通过50个Python案例了解深度学习和神经网络

通过50个Python案例了解深度学习和神经网络 摘要:机器学习 (Machine Learning, ML)、深度学习 (Deep Learning, DL) 和神经网络 (Neural Networks, NN) 是人工智能领域的核心技术。Python 是学习和实践这些技术的首选语言,因为它提供了丰富的库(如 scikit-learn、Te…...

vue3 - keepAlive缓存组件

在Vue 3中&#xff0c;<keep-alive>组件用于缓存动态组件或路由组件的状态&#xff0c;避免重复渲染&#xff0c;提升性能。 我们新建两个组件&#xff0c;在每一个组件里面写一个input&#xff0c;在默认情况下当组件切换的时候&#xff0c;数据会被清空&#xff0c;但…...

自由学习记录(58)

Why you were able to complete the SpringBoot MyBatisPlus task smoothly: Clear logic flow: Database → Entity → Service → Controller → API → JSON response. Errors are explicit, results are verifiable — you know what’s broken and what’s fixed. Sta…...

短信侠 - 自建手机短信转发到电脑上并无感识别复制验证码,和找手机输验证码说再见!

自建手机短信转发到电脑上并无感识别复制验证码 一、前言 项目开发语言&#xff1a;本项目使用PythonRedisC#开发 你是否也遇到过这样的场景&#xff1a; 正在电脑上操作某个网站&#xff0c;需要输入短信验证码手机不在身边&#xff0c;或者在打字时来回切换设备很麻烦验证码…...

课程10. 聚类问题

课程10. 聚类问题 聚类此类表述的难点K 均值法让我们推广到几个集群的情况如果我们选择其他起始近似值会怎样&#xff1f; 结论在 sklearn 中的实现 如何处理已发现的问题&#xff1f;层次聚类Lance-Williams 算法Lance-Williams 公式在Scipy中实现 示例DBSCANDBSCAN 算法 聚类…...

深度学习中的数据增强:提升食物图像分类模型性能的关键策略

深度学习中的数据增强&#xff1a;提升食物图像分类模型性能的关键策略 在深度学习领域&#xff0c;数据是模型训练的基石&#xff0c;数据的数量和质量直接影响着模型的性能表现。然而&#xff0c;在实际项目中&#xff0c;获取大量高质量的数据往往面临诸多困难&#xff0c;…...

QT设计权限管理系统

Qt能够简单实现系统的权限设计 首先我们需要一个登陆界面 例如这样 然后一级权限&#xff0c;可以看到所有的内容&#xff0c;不设置菜单栏的隐藏。 然后其他权限&#xff0c;根据登陆者的身份进行菜单栏不同的展示。 菜单栏的隐藏代码如下&#xff1a; ui->actionuser-…...