DAY6 线程
作业1:
多线程实现文件拷贝,线程1拷贝一半,线程2拷贝另一半,主线程回收子线程资源。
代码:
#include <myhead.h>
sem_t sem1;
void *copy1()//子线程1函数 拷贝前一半内容
{int fd1=open("./1.txt",O_RDONLY);int fd2=open("./2.txt",O_CREAT|O_RDWR|O_APPEND,0664);if(fd1==-1){perror("open");}if(fd2==-1){perror("open");}char s[100];int sum1=0,res1=0;int len=lseek(fd1,0,SEEK_END);//统计文件字节数lseek(fd1,0,SEEK_SET);//统计完光标要返回while(1){res1=read(fd1,s,sizeof(s));sum1+=res1;//每读一次,把读取长度加起来if(res1==0||sum1>len/2){int k=res1-(sum1-len/2);//该次读取字节数-超过len/2的字节数write(fd2,s,k);break;}write(fd2,s,sizeof(s));//把读取到的字节写入2.txt}printf("线程1拷贝完成\n");close(fd1);close(fd2);sem_post(&sem1);pthread_exit(NULL);
}
void *copy2()//子线程2函数 拷贝后一半内容
{sem_wait(&sem1);int fd1=open("./1.txt",O_RDONLY);int fd2=open("./2.txt",O_CREAT|O_RDWR|O_APPEND,0664);if(fd1==-1){perror("open");}if(fd2==-1){perror("open");}int fd3;int res2=0;int len=lseek(fd1,0,SEEK_END);//统计文件字节数lseek(fd1,0,SEEK_SET);//统计完光标要返回dup2(fd1,fd3);//fd3重定向fd1lseek(fd3,len/2,SEEK_SET);//fd3光标移动中间char s[100];while(1){res2=read(fd3,s,sizeof(s));if(res2==0){break;}write(fd2,s,res2);}printf("线程2拷贝完成\n");close(fd1);close(fd2);close(fd3);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{pthread_t tid1,tid2;sem_init(&sem1,0,0);if(pthread_create(&tid1,NULL,copy1,NULL)){perror("pthread_create");return -1;}if(pthread_create(&tid2,NULL,copy2,NULL)){perror("pthread_create");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);printf("回收完成\n");sem_destroy(&sem1);return 0;
}
运行测试结果:

作业2:线程同步之条件变量
生产者先让消费者组成一个队列,生产者生产了一台劳斯莱斯,唤醒第一个消费者来消费,然后再生产第二台劳斯莱斯,唤醒第二个消费者来消费,这样可以精确化的控制生产者线程和消费者线程的协同
代码:
#include <myhead.h>
#define MAX 10
pthread_cond_t cond;
pthread_mutex_t mtx;
sem_t sem;
int n=0,count=0;
void *producer()
{for(int i=0;i<MAX;i++){sem_wait(&sem);//用条件变量卡一下n++;printf("生产了一台特斯拉%d\n",n);pthread_cond_signal(&cond);//唤醒一个等待线程}pthread_exit(NULL);
}
void *consumer()
{pthread_mutex_lock(&mtx);//进入后锁住pthread_cond_wait(&cond,&mtx);//条件变量每接受一次进入后重新上锁count++;printf("消费了一台特斯拉%d\n",count);usleep(200000);pthread_mutex_unlock(&mtx);sem_post(&sem);//条件变量放行pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{pthread_t tid1,tid2[MAX];pthread_cond_init(&cond,NULL);//条件变量pthread_mutex_init(&mtx,NULL);//互斥锁sem_init(&sem,0,1);//条件变量if(pthread_create(&tid1,NULL,producer,NULL)!=0){perror("pthread_create");return -1;}for(int i=0;i<MAX;i++){if(pthread_create(&tid2[i],NULL,consumer,NULL)!=0){perror("pthread_create");return -1; }}pthread_join(tid1,NULL);for(int i=0;i<MAX;i++){pthread_join(tid2[i],NULL);}pthread_mutex_destroy(&mtx);pthread_cond_destroy(&cond);return 0;
}
运行测试结果:

作业3:
互斥锁,无名信号量,条件变量再练习一遍
1.互斥锁代码如何实现
代码:
#include <myhead.h>
pthread_mutex_t mtx;//定义互斥锁
void *fun(void *n)
{pthread_mutex_lock(&mtx);//上锁printf("%d\n",*(int *)n);pthread_mutex_unlock(&mtx);//解锁pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{pthread_t tid1,tid2;int num1=1,num2=2;pthread_mutex_init(&mtx,NULL);//初始化互斥锁if(pthread_create(&tid1,NULL,fun,&num1))//子线程1{perror("pthread_create");return -1;}if(pthread_create(&tid2,NULL,fun,&num2))//子线程2{perror("pthread_create");return -1;}pthread_join(tid1,NULL);//阻塞回收线程pthread_join(tid2,NULL);pthread_mutex_destroy(&mtx);//毁锁return 0;
}
运行测试结果:

2.无名信号量
代码:
#include <myhead.h>
#define MAX 5
sem_t sem;//定义无名信号量
int n=0;
void *producer()
{for(int i=0;i<MAX;i++){n++;printf("生产了特斯拉%d\n",n);}sem_post(&sem);//释放无名变量pthread_exit(NULL);
}
void *consumer()
{sem_wait(&sem);//申请无名变量printf("消费了一台特斯拉%d\n",n);n--;sem_post(&sem);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{pthread_t tid1,tid[MAX];sem_init(&sem,0,0);//初始化无名信号量if(pthread_create(&tid1,NULL,producer,&n)!=0){perror("pthread_create");return -1;}for(int i=0;i<MAX;i++){if(pthread_create(&tid[i],NULL,consumer,&n)!=0){perror("pthread_create");return -1;}}pthread_join(tid1,NULL);for(int i=0;i<MAX;i++){pthread_join(tid[i],NULL);}sem_destroy(&sem);//销毁无名变量return 0;
}
运行测试结果:

3.条件变量
见作业2
Xmind知识点:




相关文章:
DAY6 线程
作业1: 多线程实现文件拷贝,线程1拷贝一半,线程2拷贝另一半,主线程回收子线程资源。 代码: #include <myhead.h> sem_t sem1; void *copy1()//子线程1函数 拷贝前一半内容 {int fd1open("./1.txt",O…...
基于STM32的智能门锁系统设计思路:蓝牙、RFID等技术
一、项目概述 在现代家居安全领域,传统门锁因其安全性不足、开锁方式单一等问题,已逐渐无法满足用户的需求。传统机械锁容易被撬开、复制钥匙,同时开锁方式仅限于物理钥匙,给用户带来不便。因此,本文旨在设计并开发一…...
AndroidStudio-广播
一、广播的本质 广播是一种数据传输方式 二、Android 中的广播 发送一条广播,可以被不同的广播接收者所接收,广播接收者收到广播之后,再进行逻辑处理。 三、收发标准广播 广播的收发过程分为三个步骤: 1.发送标准广播 2.定义…...
基于表格滚动截屏(表格全部展开,没有滚动条)
import html2canvasPro from html2canvas // 截图,平辅表格 async function resetAgSize() {const allColumns gridApi.value.getColumns()let totalColumnWidth 0let totalColumnHeight 0// 遍历每一个行节点gridApi.value.forEachNode((rowNode) > {totalCo…...
洛谷P1255
P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 数楼梯 题目描述 楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。 编一个程序,计算共有多少种不同的走法。 输入格式 一个数字,楼梯数。 输出格式 输出走的方式总数。 样…...
vue3设置第三方组件 样式::v-deep
在Vue 3中,使用了Composition API的组件可以通过<style>标签内部的::v-deep选择器来深入作用于第三方组件的样式。::v-deep是一个 Scoped CSS 的“深度选择器”,可以穿透组件边界,影响子组件的样式。比如我想修改el-date-picker的颜色边…...
JAVA学习日记(十四)集合进阶
一、单列集合Collection List系列集合特点:添加的元素是有序(存和取的顺序一致)、可重复、有索引 Set系列集合特点:添加的元素是无序(存和取的顺序有可能不一致)、不重复、无索引 Collection是所有单列集合…...
mysql全量与增量备份
binlog日志: 从上一次全量备份到下一次全量备份直接产生的数据。 一、全备和增量备份介绍 1、全量备份: 备份所有数据库或只备份一个数据库,全量备份之后,全量备份之前的binlog日志就没用了,一般生产环境会保留3-7天…...
“非法”操控lambda(python)
能过python解释器关卡即是合法脚本代码,偶尔的“违规”操控也是一种唯美。 (笔记模板由python脚本于2024年11月13日 11:18:21创建,本篇笔记适合熟悉python的lambda操控的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.pyth…...
UDP协议和TCP协议之间有什么具体区别?
UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)是两种常见的网络传输协议,它们在数据传输中有着显著的区别和适用场景。理解它们的区别对于网络工程师、软件开发人员以及网络安全专家都是至关重要的…...
论文5—《基于改进YOLOv5s的轻量化金银花识别方法》文献阅读分析报告
论文报告:基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档 基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档摘要国内外研究现状国内研究现状国外研究现状 研究目的研究问题使用的研究方法试验研究结果文献结论创新点和对现有研究的贡献1. 目标检测技术2. …...
快手直播间采集教程,快手引流,快手截流,截流工具,直播间截流,快手直播间采集,获客系统,获客软件
功能: 1.输入快手直播间链接可一键监控直播间 2.可采集新进直播间的人 3.可采集直播间所有动作,包含:发弹幕的人和内容、送礼物的人和送的礼物、点亮爱心的人 4.可一键导出新进直播间的快手ID 5.可一键导出直播间动作列表,也可以筛…...
探索MoviePy:Python视频编辑的瑞士军刀
文章目录 🎬 探索MoviePy:Python视频编辑的瑞士军刀第一部分:背景介绍第二部分:MoviePy是什么?第三部分:如何安装MoviePy?第四部分:MoviePy的基本函数使用方法1. 视频剪辑2. 视频拼接…...
mysql 实现分库分表之 --- 基于 MyCAT 的分片策略详解
引言 在我们日常工作的项目中,特别是面向 C 端用户的产品,随着业务量的逐步扩大,数据量也呈指数级增长。为了应对日益增长的数据库压力,数据库优化已成为项目中不可或缺的一环,而分库分表则是海量数据优化方案中的重要…...
Opencascade基础教程(14): 一个模型显示问题
如果显示模型时出现如图情况,正对屏幕的平面特别亮,只需要设置材质为非金属就行。 //创建box并显示TopoDS_Shape aShape BRepPrimAPI_MakeBox(100, 100, 100);Handle(AIS_Shape) aisShpae new AIS_Shape(aShape);aisShpae->SetDisplayMode(AIS_Shad…...
ISP——你可以从这里起步(二)
接上一篇,上一篇是原理篇,这一篇是实战篇,为了实现下面框图中的不完美ISP。 第一章 做一张RAW图自己用 不是所有的人都能获得raw图,即使获得了raw图也需要对应的sensor参数才能把它用起来,所以我找了一条野路子可以把…...
Qt / Qt Quick程序打包的一些坑 (四)
【写在前面】 打包方法见 Qt / Qt Quick程序打包的方法。 这里是再次记录一些坑。 【正文开始】 直接进入正题: 在 Qt5 中,如果我们的 Qml 中使用了【Qt Shapes】模块,那么在打包的时候,会缺少Qt5QuickShapes.dll。 然后ÿ…...
《传统视觉算法在视觉算法中的地位及应用场景
一、引言 在计算机视觉领域的发展历程中,传统视觉算法扮演了至关重要的角色。尽管近年来深度学习算法在视觉任务中取得了巨大的成功,但传统视觉算法依然具有不可替代的地位。传统视觉算法通常基于数学模型和手工设计的特征,具有计算效率高、…...
老老实实干一辈子程序员是没出息的!这本证书你早该学!
一、程序员有没有必要学软考? 当然有,因为你不可能一辈子都是程序员。 你了解或者接触过30岁、35岁以上的程序员去向吗? 我毕业快十年了,当初正赶上互联网时代的浪潮,好几个学计算机的同学毕业后去了一线城市或者深…...
鸿蒙next版开发:相机开发-录像(ArkTS)
在HarmonyOS 5.0中,ArkTS提供了一套完整的API来管理相机功能,特别是录像功能。本文将详细介绍如何在ArkTS中实现录像功能,并提供代码示例进行详细解读。 录像功能开发步骤 1. 导入相关接口 首先,需要导入相机相关的接口&#x…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
