【进程与线程】
文章目录
- 一、实验目的
- 二、实验内容与设计思想
- 实验内容
- 设计思路
- 三、实验代码实现
- 四、总结
一、实验目的
1.深刻理解进程和线程的概念,掌握线程与进程在组成成分上的差别;
2.进一步认识并发执行的实质。
二、实验内容与设计思想
实验内容
用pipe()
创建一个管道文件,再用fork()
创建两个生产者进程和两个消费者进程,让它们通过pipe()
传递信息。同时,由clone()
创建的线程之间通过共享内存通信,并考虑互斥问题。
设计思路
- 管道通信:使用
pipe(pipe1)
和pipe(pipe2)
创建两个管道,作为生产者和消费者之间的通信桥梁。 - 共享内存:利用
shmget()
创建共享内存,通过shmat()
将其附加到进程的地址空间。ShmData
结构体用于存储共享状态,包含缓冲区、指向缓冲区的进程标识符以及互斥锁和信号量。 - 进程与线程工作流程:每个生产者通过写入管道生成消息并打印,每个消费者从管道读取消息并打印消费信息。使用
pthread_create
创建消费者线程,这些线程会从共享内存读取数据。最后,在所有进程和线程工作完成后,清理共享内存、信号量和互斥锁。
三、实验代码实现
以下是具体的实验代码:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <pthread.h>
#include <semaphore.h>#define BUFFER_SIZE 8
#define SHM_SIZE sizeof(ShmData)typedef struct {char buffer[BUFFER_SIZE][10];int in;int out;pthread_mutex_t mutex;sem_t full;sem_t empty;
} ShmData;void* consumer_thread(void* arg);
void producer(int write_fd, int id);
void consumer(int read_fd, int id);int main() {int pipe1[2], pipe2[2];pid_t pid1, pid2, pid3, pid4;// 创建两个管道if (pipe(pipe1) == -1 || pipe(pipe2) == -1) {perror("pipe");exit(1);}// 创建共享内存int shm_id = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);if (shm_id == -1) {perror("shmget");exit(1);}ShmData* shm_data = (ShmData*)shmat(shm_id, NULL, 0);if (shm_data == (ShmData*)-1) {perror("shmat");exit(1);}// 初始化共享内存中的数据memset(shm_data->buffer, 0, sizeof(shm_data->buffer));shm_data->in = 0;shm_data->out = 0;pthread_mutex_init(&shm_data->mutex, NULL);sem_init(&shm_data->full, 0, 0);sem_init(&shm_data->empty, 0, BUFFER_SIZE);// 创建两个生产者进程for (int i = 0; i < 2; i++) {if ((pid1 = fork()) == 0) {// 生产者1producer(pipe1[1], i);exit(0);}if ((pid2 = fork()) == 0) {// 生产者2producer(pipe2[1], i);exit(0);}}// 创建两个消费者进程for (int i = 0; i < 2; i++) {if ((pid3 = fork()) == 0) {// 消费者1consumer(pipe1[0], 0);exit(0);}if ((pid4 = fork()) == 0) {// 消费者2consumer(pipe2[0], 1);exit(0);}}// 创建消费者线程pthread_t thread1, thread2;pthread_create(&thread1, NULL, consumer_thread, (void*)shm_data);pthread_create(&thread2, NULL, consumer_thread, (void*)shm_data);// 等待所有进程wait(NULL);wait(NULL);wait(NULL);wait(NULL);pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 清理资源shmdt(shm_data);shmctl(shm_id, IPC_RMID, NULL);sem_destroy(&shm_data->full);sem_destroy(&shm_data->empty);pthread_mutex_destroy(&shm_data->mutex);return 0;
}void producer(int write_fd, int id) {for (int i = 1; i <= 5; i++) {char message[10];sprintf(message, "P%d: %d", id, i);write(write_fd, message, strlen(message) + 1);printf("Producer %d produced: %s\n", id, message);sleep(1); // 模拟生产延迟}close(write_fd);
}void consumer(int read_fd, int id) {char buffer[10];while (1) {int bytes_read = read(read_fd, buffer, sizeof(buffer));if (bytes_read > 0) {printf("Consumer %d consumed: %s\n", id, buffer);} else {break; // 生产者结束时退出}}close(read_fd);
}void* consumer_thread(void* arg) {ShmData* shm_data = (ShmData*)arg;while (1) {sem_wait(&shm_data->full);pthread_mutex_lock(&shm_data->mutex);// 消费数据printf("Consumer Thread consumed: %s\n", shm_data->buffer[shm_data->out]);shm_data->out = (shm_data->out + 1) % BUFFER_SIZE;}return NULL;
}
- 实验结果
四、总结
- 遇到的问题
在进行代码编译时,我遇到了错误。通过查询资料得知,是编译时没有链接成功pthead
库。在编译命令中加上-lpthread
后,代码就可以顺利编译成功了。
这次调试经历让我明白,在实际编程中,不仅要掌握代码逻辑,还要熟悉编译环境和相关库的使用。
- 实验反思:
- 资源管理的严谨性
实验中严格遵循 “创建 - 使用 - 销毁” 的资源管理流程:共享内存通过shmctl(IPC_RMID)标记删除,信号量用sema_destroy()释放,互斥锁通过pthread_mutex_destroy()销毁。这让我意识到,并发程序的稳定性不仅取决于逻辑正确性,更依赖资源的及时释放,避免内存泄漏或句柄残留。 - 跨平台兼容性的考量
实验代码中使用了 GNU 扩展宏_GNU_SOURCE,以及 Linux 特有的系统调用(如shmget、pipe)。若需跨平台运行,需改用 POSIX 标准接口或添加条件编译,这为后续学习分布式系统打下了兼容性思维的基础。 - 日志与调试的重要性
在调试阶段,通过打印进程 ID(getpid())、线程 ID(pthread_self())及缓冲区指针,快速定位到线程安全问题。这让我深刻体会到,合理添加调试日志是排查并发问题的 “利器”,甚至比单步调试更高效。
相关文章:
【进程与线程】
文章目录 一、实验目的二、实验内容与设计思想实验内容设计思路 三、实验代码实现四、总结 一、实验目的 1.深刻理解进程和线程的概念,掌握线程与进程在组成成分上的差别; 2.进一步认识并发执行的实质。 二、实验内容与设计思想 实验内容 用pipe()创…...
项目实战-飞机大战【补档】
和项目实战-贪吃蛇大作战【补档】-CSDN博客一样,这也是一个我在大一和网友完成的项目的补档。Dont waste your youth—time flies. 目录 1.工具&环境 2.项目简介 3.需求文档 4.流程图 5.产品原型图 6.可行性分析 7.源代码 8.实战效果 编辑 9.心得…...
算法基础学习|02归并排序——分治
一、思路 (1)确定分界点:mid(lr)/2 ——这里和快排不同 (2)递归排序(left right) (3)归并——合二为一 时间复杂度nlogn 二、题目练习 三、模板 归并排序 …...
测试基础笔记第十六天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、UI自动化介绍1.认识UI自动化测试2.实施UI自动化测试前置条件3.UI自动化测试执行时机4.UI自动化测试核心作用和劣势 二、认识Web自动化测试工具-Selenium021.Sel…...
Android项目中使用ComposeUI
首先确认项目环境kotlin版本,以下是本机的版本 使用命令 ./gradlew -version 这里kotlin 版本是1.5.31 然后查看build.gradle sdk版本 这里是32 属于低版本 然后需要添加以下配置 buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersio…...
springboot中有关数据库信息转换的处理
现代项目一般都是前后端分离的,前端只负责展示数据,不负责对数据处理,所以所有数据处理工作都由后端进行 比如在仿京东中的status,审核信息展示,数据库中是以0/1显示,但是前端需要以"审核/未审核&quo…...
HHsuite同源序列搜索数据库构建
HHsuite 可用的数据库格式简介 HHsuite 是用于蛋白质序列比对和同源性检测的工具套件,它使用特定的数据库格式以实现高效的数据存储和快速的检索。HHsuite 常用的数据库格式主要基于 FFINDEX(Flat-File Index),这是一种简单而高效的文件索引系统,它将数据文件(如蛋白质序…...
大模型推理:Qwen3 32B vLLM Docker本地部署
Qwen3基础知识 此次Qwen3开源8个模型(MOE架构:Qwen3-235B-A22B、Qwen3-30B-A3B,Dense架构:Qwen3 0.6B/1.7B/4B/8B/14B/32B),新版本的Qwen3特性包括: 支持混合思维模式,即推理/非推…...
第十六届蓝桥杯 2025 C/C++B组 第二轮省赛 全部题解(未完结)
目录 前言: 试题A:密密摆放 试题B:脉冲强度之和 试题C:25之和 试题D:旗帜 试题H:破解信息 前言: 这是我后续刷到的第二轮省赛的题目,我自己也做了一下,和第一轮省赛…...
域名转移:什么是转移码/EPP码/授权码?
关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...
Android 系统发展史
Android 1.0:2008年9月 全球第一台安卓设备是 HTC Dream Google地图、YouTube、HTML浏览器、Gmail、即使消息、短信、彩信、日历等 Android Market(应用程序商店) Android 1.1:2009年2月(Petit Four 花色小蛋糕&am…...
Python中的defaultdict方法
文章目录 核心特点基本语法常见使用场景1. 分组数据(默认值为列表)2. 计数(默认值为整数)3. 集合操作(默认值为集合)4. 嵌套字典 注意事项与普通字典对比总结1. 键(Key)的类型2. 值&…...
Android启动应用时屏蔽RecyclerView滑动,延时后再允许滑动,Kotlin
Android启动应用时屏蔽RecyclerView滑动,延时后再允许滑动,Kotlin var bCanScrollVertically falselifecycleScope.launch(Dispatchers.Default) {repeatOnLifecycle(Lifecycle.State.CREATED) {Log.d(TAG, "Lifecycle.State.CREATED")delay(…...
2025运维工程师面试题1(答案在后一张)
一、逻辑思维能力考核: 问题1: 3个人去投宿,一晚30元三个人每人掏了10元凑够30元交给了老板后来老板说今天优惠只要25元就够了,拿出5元命令服务生退还给他们,服务生偷偷藏起了2元,然后,把剩下…...
在网页中使用【LaTeX 数学公式块】的完整步骤总结
以下是在网页中使用 LaTeX 数学公式块的完整步骤总结,记录如何让网页正确渲染 LaTeX 数学表达式(如 \(H(X) -\sum p(x) \log p(x)\) 这样的公式): ✅ 使用 LaTeX 数学公式块的完整步骤(以 KaTeX 为例) &am…...
新人销售如何找精准客户?
深入了解自身产品或服务。 清晰掌握产品优势、应用场景和解决的问题,比如销售办公软件,要熟知其提升办公效率的具体功能,以此定位需求客户。 利用社交媒体平台。 像领英可完善资料,加入行业群组分享内容吸引潜在客户࿱…...
【Unity】使用Socket建立客户端和服务端并进行通信的例子
Socket服务端: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; public class SocketServer { public static Socket listenSocket;//监听Socket public static List<Socket>…...
为什么要学习《易经》?
《易经》精华解读:变易之道与人生智慧 《易经》(《周易》)是中国最古老的经典之一,被誉为“群经之首,大道之源”。它不仅是占卜之书,更是一部哲学经典,揭示了宇宙运行的规律和人生处世的智慧。…...
13.继承、重载、重写、多态、抽象类、接口、final、Static的学习
一、继承 继承:你继承谁你就是谁,继承是一种严格的父子关系 (在父类里面抽取的属性和方法一定是所有子类所共有) (Student继承Person,那么Student就是人) UML: 类图(描述类和类之间的…...
SpringBoot Actuator未授权访问漏洞的全面解析与解决方案
引言 SpringBoot Actuator 作为应用监控与管理的核心组件,为开发者提供了丰富的系统自省和运维能力。然而,其默认配置中可能存在的未授权访问漏洞,已成为企业安全防护的潜在风险。本文将从漏洞原理、影响范围、检测方法到解决方案,系统性地剖析该问题,并提供覆盖开发、运维…...
使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1)
背景 用户在WEB页面上点击按钮,服务端需要执行一系列操作,该操作系列步骤较多且耗时长,为了更好的给用户浏览体验,需要在每进行一个步骤由服务端推送消息给客户端(浏览器),避免一个长时间的操作…...
一网统管建设组织保障分工常见表
在 “一网统管” 建设进程中,强有力的组织保障体系与各业务部门间的紧密分工协作是确保建设成效的关键。 从组织保障层面来看,需建立专门的 “一网统管” 建设领导小组,由政府高层领导担任组长,各关键业务部门负责人作为组员,以此强化对整体建设工作的统筹规划与组…...
JVM | CMS垃圾收集器详解
目录 CMS垃圾回收器简介 为什么CMS图中初始标记的阶段是单线程?为啥不多线程?当然现在默认多线程了。 CMS的两种模式与一种特殊策略 Backgroud CMS 记忆集 卡表 ForeGroud CMS CMS的标记压缩算法 三色标记 (便于理解而被后人提出&am…...
android开发中的多线程、数据存储同步功能实现方案和应用场景
在Android开发中,多线程、数据存储与同步功能有多种实现方案,以下是详细介绍及其应用场景: 多线程 实现方案: Thread类与Runnable接口:通过继承Thread类并重写run方法,或实现Runnable接口并将其传入Threa…...
【C++初阶】--- 模板进阶
1.非类型模板参数 • 模板参数分类类型形参与非类型形参。 • 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 • 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参…...
数据库所有知识
# 第一章 数据库-理论基础 ## 1.1 什么是数据库 数据: 描述事物的符号记录, 可以是数字、 文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机。 数据库: 存储数据的仓库,…...
docker部署的Nextcloud,处于维护模式,如何解决
Nextcloud 在升级后卡在维护模式,以下是针对 Docker 部署的解决方案: 1. 通过 OCC 命令强制关闭维护模式 进入 Nextcloud 容器内部执行命令: # 替换 nextcloud 为你的容器名称 docker exec -it --user www-data nextcloud php occ maintena…...
mongoose插入文档,字段类型, 字段验证, 删除文档,更新文档,读取文档,查询文档的条件控制 ,字段筛选,数据排序,数据截取
、Mongoose 中与 文档操作(插入、查询、更新、删除)及其相关功能(字段类型、验证、条件筛选、排序、分页等)相关示例: 📋 一、字段类型定义(Schema Types) const mongoose require…...
源码编译安装LAMP
一:LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP…...
C++每日训练 Day 18:构建响应式表单与数据验证(初学者友好)
📘 本篇目标:在前几日协程与事件驱动机制基础上,构建一个响应式表单系统,实现用户输入的异步验证与反馈。通过协程挂起/恢复机制,简化异步逻辑,提升代码可读性。 🔁 回顾 Day 17:响应…...
Linux环境变量以及进程虚拟地址原理
目录 一、介绍进程优先级 1.什么是优先级 2.为什么会有优先级 3.Linux中的优先级是怎么确定的 1)查看Linux中的优先级 2)计算优先级和更改优先级 二、环境变量 1.什么是环境变量 2.环境变量有什么作用 3.环境变量怎么做到的 1)查看系统已有的…...
基于非递归求解的汉诺塔超级计算机堆栈与数据区设计方案
基于非递归求解的汉诺塔超级计算机堆栈与数据区设计方案 一、设计背景与目标 汉诺塔问题存在非递归直接求解方法,相较于递归法具有明确移动规律和潜在性能优势。本设计旨在利用非递归求解规律,优化汉诺塔超级计算机的堆栈与数据区结构,降低…...
【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)
【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso) qemu提供了运行ARM虚拟机的方法 具体的操作方式就是建立一个硬盘img 然后通过iso安装到img 最后再运行img即可 这种方式教程很多 很简单 …...
CISC与RISC详解:定义、区别及典型处理器
一、CISC(复杂指令集计算机) Complex Instruction Set Computer 核心思想:通过设计复杂的指令,减少程序指令数量,以硬件复杂度换取编程便利性。 主要特点: 指令复杂度高: 单条指令可完成多步操…...
数据库中DDL、DML、DCL的区别是什么?
数据库中DDL、DML、DCL的区别是什么? 在数据库的使用过程中,SQL(结构化查询语言)常常被用来执行不同的操作,主要分为三类:DDL(数据定义语言)、DML(数据操纵语言…...
【东枫电子】AI-RAN:人工智能 - 无线接入网络
太原市东枫电子科技有限公司,翻译 文章目录 1.概述1.1 什么是AI-RAN?1.2 为什么是AI-RAN?1.3 AI-RAN有哪些好处?1.4 为什么 AI-RAN 会给通信服务提供商 (CoSP) 带来变革?1.5 AIRAN 的构建模块是什么? 2. 参…...
实习技能记录【5】-----项目中消息传递到ui层的方法
代码 while (1){osEvent evt;evt osMailGet(ui_msg_mailbox, 0);if (evt.status osEventMail){UI_MSG_APP_T *msg (UI_MSG_APP_T *)evt.value.p;if (msg->cmd_type CMD_TYPE_INNER){if (msg->cmd_code CMD_CODE_INNER_REFRESH_NOW){lv_obj_invalidate(lv_scr_act()…...
4.29【Q】paraCompute
还是同样的要求,我要写实验报告,如何组织描述运行时间,加速比,效率等随数据规模,进程数,线程数变化的语言和逻辑,从而显得不冗余和精简?为我生成合理排版,布局的文字&…...
什么是布林带?
什么是布林带? 布林带是约翰布林格在20世纪80年代开发的一种广泛使用的技术分析工具。布林带由价格图表上的三条线组成:中轨、上轨和下轨。中轨通常是20天简单移动平均线(SMA),代表资产在此期间的平均价格。上轨和下轨…...
爬虫学习笔记(四)---request入门
例1 例1:写一个爬取百度搜索页面的程序,以搜索一个喜欢的明星为例(如在搜索框中输入周杰伦) 正常搜索 页面 爬虫思路: 1.用一个query变量,在控制台输入的方式更加灵活的输入想爬取的明星的百度搜索页面 …...
JSON配置文件格式全解析与多语言实战指南
JSON配置文件格式全解析与多语言实战指南 摘要 本文全面解析JSON配置文件的核心语法规范,深入探讨数据类型、转义机制及JSON5扩展特性,提供JavaScript/Python/Java等多语言解析方案。通过典型应用场景案例演示JSON的最佳实践,帮助开发者高效…...
JavaScript 中的类型转换机制?
一、类型转换的两种模式 1. 显式转换(手动翻译) 你主动告诉 JavaScript 如何转换类型,比如: let num Number("123"); // 字符串 → 数字:123 let str String(123); // 数字 → 字符串:&qu…...
【分享】音频音乐剪辑[特殊字符]人声分离伴奏提取[特殊字符]拼接合并
音频音乐剪辑是一款专业的剪辑软件。在剪辑过程中,它可以对音频进行拼接合成、音乐裁剪、变调变速、格式转换,同时音频音乐剪辑还是一款支持高清录音、音频降噪等众多功能于一体的音频制作软件。 【应用名称】:音频剪辑 【应用版本】…...
关于 const a 定义的数据 与 其渲染 的问题。即通过const定义的常量,会不会导致渲染不及时。
情况1 (同2、4结论一致) 定义:使用子hook,将数据 const a 【对stateX的一系列操作】 封存到子hook里。并return出去。结果:此种情况不影响实时渲染。缺点:只要stateX变更,一定展示c的最新数据…...
开源Kotlin从零单排0基础完美入门教程
🚀 Kotlin 从零单排 一个让你欲罢不能的 Kotlin 入门教程! 教程仓库地址 👋 Hey,你好啊! 如果你: 🤔 听说 Kotlin 很香,但不知道香在哪?😅 Java 写得头大&a…...
主流微前端框架比较
主流微前端框架比较 以下表格列出了当前主流微前端框架的核心对比信息,包括基本介绍、核心特性、适用场景、技术栈兼容性、优缺点、社区维护情况和典型应用案例等: 框架基本介绍核心特性与机制适用场景技术栈兼容性优缺点社区维护情况典型应用案例qiankun蚂蚁金服推出的生产…...
DOM 事件的处理通常分为三个阶段:捕获、目标、冒泡【前端示例】
如果神明还不帮你,说明他相信你。 目录 引言:捕获阶段:目标阶段:冒泡阶段:事件传播示意图:示例:代码:解读:输出: 引言: DOM 事件的处理通常分为三…...
C#实现对达索(Dassault)SolidWorks中3D图纸转化为手机可直接查看预览图纸格式
转化环境无需安装SolidWorks。 代码更新:暂不公开。 实现效果:...
Twitter 工作原理|架构解析|社交APP逻辑
这是对Twitter 工作原理|架构解析|社交APP逻辑_哔哩哔哩_bilibili的学习,感谢up小凡生一 在两年半前,埃隆马斯克收购了Twitter,并且进行了一系列重大改革。今天我们来解析一下这个全球知名社交平台的架构。首先&#x…...
模拟集成电路设计与仿真 : Feedback System
前情提要 此為作者針對迴授系統,進行資料統整,以便日後查詢 原理 1. The Whole System 更正 : V - V feedback 是 並 - 串 迴授 2. Feedback Block Beta 更正 : ,所以 the whole systemfeedback block左 2右 1 feedback block feed…...